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  執行代碼所需要的參數。

replace_existing:   默認不設置的話回導致重啟項目后,  爆id已存在的錯誤, 設置此參數后會對已有的 id 進行覆蓋從而避免報錯

next_run_time:  datetime 開始執行時間

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

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

執行結果查看

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

django_apscheduler_djangojob 表保存注冊的任務以及下次執行的時間

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

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

其他問題

APScheduler  在 uwsgi 環境下會有存在復數個進程同時啟用的問題, 從而重復執行占用資源

解決方式  這這這

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM