您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關django怎么實現celery動態設置周期任務執行時間,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
PaaS平臺不僅將應用服務的運行和開發環境作為一種服務提供給開發者用戶,更為開發者用戶提供了高效便捷的開發服務,如:組件系統,統一登錄,權限管理,后臺框架,MagicBox,桌面/工作臺等。
PaaS平臺提供支持多語言的開發框架,助力運維人員能基于平臺之上以自己擅長的技術語言(Python、java等)開發運維自動化工具。
通過了解PaaS的設計理念,運維人員能夠基于藍鯨的PaaS平臺,從零開始進行SaaS應用的實戰開發,快速構建企業運維/運營系統,提升企業自動化水平。
開發背景
之前在一個銀行自動化運維項目中,客戶希望我們在藍鯨PaaS上開發一個數據庫巡檢SaaS。具體需求如下:
為了保障數據庫正常運行,保證數據的安全性、完整性和可用性,需要開發一個自動化巡檢工具,代替原來的人工數據庫巡檢。并且巡檢周期窗口分為日巡檢、周巡檢、月巡檢、半年度巡檢四類:
日巡檢維護指每日按計劃進行的巡檢維護活動,以檢查數據庫運行狀態、數據庫備份狀態和告警錯誤為主要內容。
周巡檢維護指按一周為周期,在每周指定日按計劃進行的巡檢維護活動,它的工作內容是在日巡檢維護工作內容的基礎上添加數據庫對象檢查、安全性檢查等內容組成。
月巡檢維護指按一月為周期,在每月指定日按計劃進行的巡檢維護活動,它的工作內容是在周巡檢維護工作內容的基礎上添加系統參數配置檢查、硬件與系統平臺運行狀態檢查等內容組成。
年度巡檢維護指按半年或者一年為周期,在指定日按計劃進行的巡檢維護活動,它的工作內容是在月巡檢維護工作內容的基礎上添加數據庫性能診斷檢查組成。
巡檢實現方式分為兩種:
1、立即巡檢
用戶首先選擇某一業務下對應的目標主機,需要巡檢的數據庫實例(支持多選),設置數據采樣區間(當前時間之前的任意時間段)。
點擊立即巡檢按鈕,等待數秒鐘,巡檢完成。點擊查看詳情,導出報告。
2、定時巡檢
用戶可以根據需求設置每天、每周、每月來執行巡檢任務。這里舉例說明一下每周,用戶首先需要配置某業務下面主機、數據庫實例、巡檢頻率、巡檢時長(任意天數)、執行時間(每周某一天的某時某分某秒),如下圖:
實現方式
針對以上需求,平時我們開發時使用periodic_task裝飾器,程序啟動后自動執行周期任務:
@periodic_task(run_every=crontab(minute='*/5', hour='*', day_of_week="*")) def get_time(): """ celery 周期任務示例 run_every=crontab(minute='*/5', hour='*', day_of_week="*"):每 5 分鐘執行一次任務 """ now = datetime.datetime.now() logger.error(u"celery 周期任務調用成功,當前時間:{}".format(now))
crontab()實例化的時候沒設置任何參數,都是使用默認值。crontab一共有7個參數,常用有5個參數分別為:
minute:分鐘,范圍0-59
hour:小時,范圍0-23
day_of_week:星期幾,范圍0-6。以星期天為開始,即0為星期天。這個星期幾還可以使用英文縮寫表示,例如“sun”表示星期天
day_of_month:每月第幾號,范圍1-31
month_of_year:月份,范圍1-12
以上方案有個弊端:
需要每次根據巡檢是周幾,來計算數據采樣區間具體時間,然后觸發定時任務,可能會存在誤差。
定時任務無法直接取消
舉例來說,假如客戶選擇每周三早上8點執行任務,采樣區間為3天。假如首次10月1日8:00執行任務,觸發定時任務獲取9月28日8:00-10月1日8:00之間的數據;然后再次執行時間為10月8日,再次觸發定時任務,循環執行。
最終,通過以下方式解決:
模板函數提前開發完成,加上@task()裝飾器:
@task() def auto_iip(**kwargs): logger.error(kwargs) '此處寫邏輯代碼'
測試每分鐘執行一次,啟動工程,啟動celery,調用下面函數,OK,等待1分鐘,sucess!
from djcelery.models import PeriodicTask, CrontabSchedule from djcelery.schedulers import ModelEntry, DatabaseScheduler def test_celery_task(date_data): crontab= CrontabSchedule.objects.create( hour='*', minute='*/1', day_of_week='*', day_of_month='*', month_of_year="*" ) schedule = crontab.schedule create_or_update_task = DatabaseScheduler.create_or_update_task #'home_application.celery_tasks.auto_iip' home模塊下的task。 task_template='home_application.celery_tasks.auto_iip' #task_name自定義,不能重復。 task_name = 'test' schedule_dict = { 'schedule': schedule, 'args': [], 'kwargs': data, 'task': task_template, 'enabled': 1 } create_or_update_task(task_name, **schedule_dict)
定時任務停止,直接根據task_name進行刪除
def delete_celery_task(task_name): DatabaseScheduler.delete_task(task_name)
關于“django怎么實現celery動態設置周期任務執行時間”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。