安裝
官方的 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 環境下會有存在復數個進程同時啟用的問題, 從而重復執行占用資源
解決方式 這這這