1. 程式人生 > 其它 >django-apscheduler 實現定時任務詳解

django-apscheduler 實現定時任務詳解

安裝

官方的 git 指引 點這裡

pip install django-apscheduler

配置

在 setting.py 的 app 裡面加入

INSTALLED_APPS = (
    # ...
    "django_apscheduler",
)

apscheduler 存在資料庫依賴. migrate 一下

migrate

會在資料庫中生成兩行表

表結構在下面的使用中再說

使用

在任意的 view.py 中或者專案的 主 urls.py 中進行操作 (其他的暫時沒試過, 不代表不行)

from apscheduler.schedulers.background import
BackgroundScheduler from django_apscheduler.jobstores import DjangoJobStore, register_job @register_job(scheduler, "interval", minutes=2, id="test_func", replace_existing=True, misfire_grace_time=120) def test_func(): views_tools.host_save() scheduler.start()

簡單的原理解釋

註冊後的任務會根據 id 以及相關的配置進行定時任務, 定時任務分為兩種

1. 定時迴圈任務 (迴圈不斷觸發 比如每 20s 執行一次)

2. 定點執行任務 (只觸發一次 比如 週一執行一次)

3. 定時定點迴圈任務 (比如 每週一執行一次)

任務的執行存在撞車的可能性, 即上一次任務沒執行完, 下次任務就來了

此時下次任務會被錯過 (missed) 上次任務不執行完. 下次任務永遠都會錯過

引數詳解

schedul:   指定排程器

trigger:   'date'、'interval'、'cron'。

  'date' + 'run_date' ----單次任務    @register_job(scheduler, 'date', id='test', run_date='

2021-07-07 00:00:00')

  'interval' + 'hours' + 'minutes' + ..... ------間隔性任務  @register_job(scheduler, 'interval', id='test', hours=3, minutes=30)

  'cron' + 'hour' + 'minute'+... -----cron類的任務    @register_job(scheduler, 'cron', id='test', hour=8, minute=30) 可選引數day,second,month..

id:   任務的名字,不傳的話會自動生成。不過為了之後對任務進行暫停、開啟、刪除等操作,建議給一個名字。並且是唯一的,如果多個任務取一個名字,之前的任務就會被覆蓋。

args:   list 執行程式碼所需要的引數。

next_run_time:  datetime 開始執行時間

misfire_grace_time:   強制執行結束的時間, 為避免撞車導致任務丟失, 沒執行完就別執行了

  此引數在 官方的 git 中沒有特別提及, 詳解可以看這裡官方的詳解

執行結果檢視

在admin 裡面檢視也較為方便, 對 admin 進行了相應的封裝方便過濾啥的, 以及狀態清晰

django_apscheduler_djangojob 表儲存註冊的任務以及下次執行的時間

django_apscheduler_djangojobexecution 儲存每次任務執行的時間和結果和任務狀態

這裡注意 missed 則是表示撞車的場景, 為避免這種場景需要在 週期的長度以及是否進行強制結束進行選擇