在Django中使用apscheduler django_apscheduler 實現定時任務, 來完成數據拉取. 一段時間后發現數據量對不上,遂查日志
發現報錯如下:
Run time of job …… next run at: ……)” was missed by
google 到的是github上的一個issue:https://github.com/agronholm/apscheduler/issues/146
里面說到了一個參數:misfire_grace_time,但是這個參數到底是干嘛用的,在其他地方找到了解釋,其中涉及到幾個其他參數,但是結合自己的理解綜合總結一下
- coalesce:當由於某種原因導致某個job積攢了好幾次沒有實際運行(比如說系統掛了5分鍾后恢復,有一個任務是每分鍾跑一次的,按道理說這5分鍾內本來是“計划”運行5次的,但實際沒有執行),如果coalesce為True,下次這個job被submit給executor時,只會執行1次,也就是最后這次,如果為False,那么會執行5次(不一定,因為還有其他條件,看后面misfire_grace_time的解釋)
- max_instance: 就是說同一個job同一時間最多有幾個實例再跑,比如一個耗時10分鍾的job,被指定每分鍾運行1次,如果我們max_instance值為5,那么在第6~10分鍾上,新的運行實例不會被執行,因為已經有5個實例在跑了
- misfire_grace_time:設想和上述coalesce類似的場景,如果一個job本來14:00有一次執行,但是由於某種原因沒有被調度上,現在14:01了,這個14:00的運行實例被提交時,會檢查它預訂運行的時間和當下時間的差值(這里是1分鍾),大於我們設置的30秒限制,那么這個運行實例不會被執行。
示例:
15分鍾一次的的任務,misfire_grace_time 設置100秒,在0:06分的時候提示:
Run time of job "9392_index (trigger: interval[0:15:00], next run at: 2018-10-27 00:15:00 CST)" was missed by 0:06:03.931026
本來應該在0:00執行的任務,某種原因沒有被調度,提示下次運行(0:15)與當前差了6分鍾(閾值100秒),所以0:15的時候將不會運行
所以這個參數可以通俗的理解為任務的超時容錯配置,給executor 一個超時時間,這個時間范圍內要是該跑的還沒跑完,就別再跑了。
解決:
@register_job(scheduler, 'cron', day_of_week='mon-fri', hour='18', minute='24', second='0', id='task_time',misfire_grace_time=3600)
增加了一行
misfire_grace_time=3600