1烘挫、前言
在做 django 開發(fā)需求時诀艰,多多少少都會遇到需要定時任務的功能,比如定時執(zhí)行任務饮六,檢查訂單之類的其垄。可能是一段時間卤橄,比如每隔 10分鐘執(zhí)行一次绿满,也可能是定點時間,比如 14:00 執(zhí)行窟扑,也可能是長時間喇颁,比如每周幾,每個月的哪一天等嚎货。查看了一下相關(guān)資料橘霎, django 定時任務 django-crontab
庫比較多教程和資料,雖然 star 數(shù)才五百殖属,但是 API 接口比較簡單姐叁,接入也很方便,功能也很全面,當然外潜,也存在一此無法解決的問題原环,使用時需要注意的。
2处窥、使用教程
1.安裝:
pip install django-crontab
2.添加配置到 settings.py INSTALLED_APPS
中
INSTALLED_APPS = (
'django_crontab',
...
)
3.編寫定時函數(shù):
定時任務可以分成兩種嘱吗,一種是執(zhí)行自定義的mange.py的命令,另一種是執(zhí)行自定義函數(shù)滔驾。
在django的app中新建一個myapp/cron.py文件谒麦,把需要定時執(zhí)行的代碼放進去
示例:
def my_scheduled_job():
pass
4.在 settings.py 中增加CRONJOBS
配置
CRONJOBS = [
('*/5 * * * *', 'myapp.cron.my_scheduled_job')
]
也可以定義一些關(guān)鍵字參數(shù),有2種格式:
格式1:
- 要求:cron計時通常格式(有關(guān)更多示例哆致,請參閱 Wikipedia 和 crontab.guru)
- 要求:python模塊路徑下待執(zhí)行定時任務
- 可選:特定于定時任務的后綴(例如弄匕,將
out/err
重定向到文件,默認值為'')
示例:
CRONJOBS = [
('*/1 * * * *', 'appname.test_crontab.test','>>/home/python/test_crontab.log')
]
注意: >>
表示追加寫入沽瞭,>
表示覆蓋寫入。
格式2:
- 要求:cron計時通常格式
- 要求:python模塊路徑下待執(zhí)行定時任務
- 可選:方法的位置參數(shù)列表(默認值:[])
- 可選:方法的關(guān)鍵字參數(shù)的dict(默認值:{})
- 可選:特定于定時任務的后綴(例如剩瓶,將
out/err
重定向到文件驹溃,默認值為'')
示例:
CRONJOBS = [
('*/5 * * * *', 'myapp.cron.other_scheduled_job', ['arg1', 'arg2'], {'verbose': 0}),
('0 4 * * *', 'django.core.management.call_command', ['clearsessions']),
]
對于熟悉 Linux 中定時任務crontab
的同學可能對上面第一個參數(shù)的語法很親切。上面表示每隔1分鐘執(zhí)行一次代碼延曙。
Linux 中的定時任務crontab
的語法如下:
* * * * * command
分鐘(0-59) 小時(0-23) 每個月的哪一天(1-31) 月份(1-12) 周幾(0-6) shell腳本或者命令
有幾個特殊的符號:
* 代表所有的取值范圍的數(shù)字
/ 代表每的意思豌鹤,*/5就是每5個單位
- 代表從某個數(shù)字到某個數(shù)字
, 分開幾個離散的數(shù)字
示例:
每兩個小時 0 */2 * * *
晚上11點到早上8點之間每兩個小時,早上8點 0 23-7,8 * * *
每個月的4號和每個禮拜的禮拜一到禮拜三的早上11點 0 11 4 * 1-3
1月1日早上4點 0 4 1 1 *
0 6 * * * commands >> /tmp/test.log # 每天早上6點執(zhí)行, 并將信息追加到test.log中
0 */2 * * * commands # 每隔2小時執(zhí)行一次
有興趣的小伙伴可以深入研究下 Linux 的crontab
定時任務枝缔。如果不了解和不熟悉可以想看: cron語法格式學習
5.添加并啟動定時任務
#添加并啟動定時任務
python manage.py crontab add
其它命令:
#顯示當前的定時任務
python manage.py crontab show
#刪除所有定時任務
python manage.py crontab remove
一些問題
如果配置成這樣:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
CRONJOBS = [
('0 7 * * 1-5', 'api.cron.email_to_late_docs', '>> {}'.format(BASE_DIR + '/logs/log_{:%d_%m_%Y}.log'.format(time.now()))),
('0 7 * * 1-5', 'api.cron.email_ten_days_before', '>> {}'.format(BASE_DIR + 'logs/log_{:%d_%m_%Y}.log'.format(time.now())))
]
上述代碼的目的是布疙,希望對任務的輸出和錯誤日志,進行 log_ddmmYY
格式進行文件每天分開保存愿卸。
但是這個任務灵临,在第二天時,就不會在執(zhí)行啦E枯儒溉!
因為,CRONJOBS
生成任務時发钝,會生成對應的哈希值(hashes)顿涣,標識每個任務。所以酝豪,當文件名變更時涛碑,CRONJOBS
中的值每天都在變化,導致不同的定時任務哈希值(hashes)孵淘。
針對這種情況蒲障,解決方法是,日志文件名稱固定,然后創(chuàng)建一個任務晌涕,用來每天把日志文件重命名(move)成想要的格式名稱滋捶,這樣就可以啦!
總結(jié)
通過這個需求余黎,可以看到很多知識點其實是串聯(lián)起來的重窟,從python
到django
到Linux
的crontab
,所以惧财,學習無止境巡扇,知識學習只會越來越多,如果你提前掌握了某些知識垮衷,那么學習新(舊)知識的成本就會降低很多厅翔,或者理解成本,比如你學習了 Linux
搀突, 了解過 cron
刀闷,那么對于學習這個 django
的定時任務會輕松很多!永遠不要認為有些知識你永遠用不上仰迁,所以現(xiàn)在就不學甸昏,可能現(xiàn)在的永遠距離已經(jīng)很短啦!加油~
參考
- kraiz/django-crontab: dead simple crontab powered job scheduling for django.
- django開發(fā)-定時任務的使用 - wyzane - SegmentFault 思否
- django-crontab 定時執(zhí)行任務方法 - 程序園
- django-crontab實現(xiàn)Django定時任務
- django使用django-crontab實現(xiàn)定時任務 - 簡書
- 使用django-crontab實現(xiàn)定時任務 - 騰訊云
- cron語法格式學習 - 簡書
- django-crontab is missing job hash after one day · Issue #76 · kraiz/django-crontab
- Cron Format - Wikipedia
- crontab.guru
- 如有疑問徐许,歡迎在評論區(qū)一起討論施蜜!
- 如有不正確的地方,歡迎指導雌隅!
注:本文首發(fā)于 iHTCboy's blog翻默,如若轉(zhuǎn)載,請注來源