您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)django中如何使用apscheduler,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
定時任務(wù)是分布式任務(wù)的一種特殊類型的任務(wù)。Django的分布式主要由Celery框架實現(xiàn),這是python開發(fā)的分布式任務(wù)隊列。由于它本身不支持消息存儲服務(wù),所以需要第三方消息服務(wù)來傳遞任務(wù),一般使用Redis。
優(yōu)點:
Celery側(cè)重于實時操作,可用于生產(chǎn)系統(tǒng)每天處理數(shù)以百萬計的任務(wù),可用于大型項目。
可在分布的機器、進(jìn)程、線程上執(zhí)行任務(wù)調(diào)度。
缺點:
配置和使用較為復(fù)雜,需要Redis數(shù)據(jù)庫和多個python第三方庫。
只需要下載一個 django-crontab 包就可以使用cron表達(dá)式在Django框架中設(shè)置定時任務(wù)。本人對這種方法了解不多,不過這種方法好像不支持windows系統(tǒng),功能也相對簡單。
配置簡單、功能齊全、使用靈活、支持windows和linux,適合中小型項目。
django-apscheduler中相關(guān)的概念和python的定時任務(wù)框架apscheduler中的概念是一樣的,有感興趣的同學(xué)可以自行查閱。
(本文使用 django + mysql 架構(gòu))
pip install django-apscheduler
復(fù)制代碼
先在settings.py中配置好數(shù)據(jù)庫信息(略).
在INSTALLED_APPS中加入django-apscheduler應(yīng)用:
INSTALLED_APPS = [ ... 'django_apscheduler', ... ]
執(zhí)行遷移
python manage.py migrate
去數(shù)據(jù)庫中看一看,生成了兩個表格,大部分都顧名思義。
1. django_apscheduler_djangojob
用于存儲任務(wù)的表格
job_state: 我猜是將任務(wù)具體的執(zhí)行代碼和參數(shù)進(jìn)行序列化后存在了這里
2. django_apscheduler_djangojobexecution
用于存儲任務(wù)執(zhí)行狀態(tài)的表格
status: 執(zhí)行狀態(tài)
duration: 執(zhí)行了多長時間
exception: 是否出現(xiàn)了什么異常
大概有兩種創(chuàng)建任務(wù)的方法:裝飾器和add_job函數(shù)。
在任意view.py中實現(xiàn)代碼(我習(xí)慣新開一個app專門實現(xiàn)定時任務(wù)):
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_events, register_job
# 實例化調(diào)度器
scheduler = BackgroundScheduler()
# 調(diào)度器使用默認(rèn)的DjangoJobStore()
scheduler.add_jobstore(DjangoJobStore(), 'default')
# 每天8點半執(zhí)行這個任務(wù)
@register_job(scheduler, 'cron', id='test', hour=8, minute=30,args=['test'])
def test(s):
# 具體要執(zhí)行的代碼
pass
# 注冊定時任務(wù)并開始
register_events(scheduler)
scheduler.start()
啟動服務(wù) python manage.py runserver
這個任務(wù)就會被存儲到django_apscheduler_djangojob表中,并按照設(shè)置定時的執(zhí)行程序。
scheduler: 指定調(diào)度器
trigger: 任務(wù)執(zhí)行的方式,共有三種:'date'、'interval'、'cron'。
'date' + 'run_date' 的參數(shù)組合, 能實現(xiàn)單次任務(wù)。
例子:2019-07-07 22:49:00 執(zhí)行任務(wù)@register_job(scheduler, 'date', id='test', run_date='2019-07-07 22:49:00')
注:在親測時,執(zhí)行完任務(wù)會報錯,原因時執(zhí)行完任務(wù)后會去mysql中刪除djangojob表中的任務(wù)。但是djangojobexecution表記錄著執(zhí)行結(jié)果,有外鍵關(guān)聯(lián)著djangojob表,所以刪除時顯示有外鍵約束錯誤。但是任務(wù)會正常執(zhí)行,執(zhí)行之后也會正常刪除。
'interval' + 'hours' + 'minutes' + ..... 的參數(shù)組合,能實現(xiàn)間隔性任務(wù)。
例子:每隔3個半小時執(zhí)行任務(wù)
還有seconds,days參數(shù)可以選擇
注:如果任務(wù)需要執(zhí)行10秒,而間隔設(shè)置為1秒,它是不會給你開10個線程同時去執(zhí)行10個任務(wù)的。它會錯過其他任務(wù)直到當(dāng)前任務(wù)完成。
@register_job(scheduler, 'interval', id='test', hours=3, minutes=30)
'cron' + 'hour' + 'minute'+...的參數(shù)組合,能實現(xiàn)cron類的任務(wù)。
例子:每天的8點半執(zhí)行任務(wù)
還有day,second,month等參數(shù)可以選擇。
@register_job(scheduler, 'cron', id='test', hour=8, minute=30)
id: 任務(wù)的名字,不傳的話會自動生成。不過為了之后對任務(wù)進(jìn)行暫停、開啟、刪除等操作,建議給一個名字。并且是唯一的,如果多個任務(wù)取一個名字,之前的任務(wù)就會被覆蓋。
args: list類型。執(zhí)行代碼所需要的參數(shù)。
next_run_time:datetime類型。開始執(zhí)行時間。如果你現(xiàn)在創(chuàng)建一個定時任務(wù),想3天后凌晨三點半自動給你女朋友發(fā)微信,那就需要這個參數(shù)了。
還有些其他的參數(shù)感興趣的同學(xué)可以查看源代碼來了解。
裝飾器的方法適合于寫代碼的人自己創(chuàng)建任務(wù),如果想讓用戶通過頁面輸入?yún)?shù),并提交來手動創(chuàng)建定時任務(wù),就需要使用add_job函數(shù)。
下面這個小例子,前端傳遞json數(shù)據(jù)給后端,觸發(fā)test_add_task函數(shù),來添加任務(wù):
import json
from django.http import JsonResponse
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore, register_events, register_job
scheduler = BackgroundScheduler()
scheduler.add_jobstore(DjangoJobStore(), 'default')
# 與前端的接口
def test_add_task(request): if request.method == 'POST': content = json.loads(request.body.decode()) # 接收參數(shù) try: start_time = content['start_time'] # 用戶輸入的任務(wù)開始時間, '10:00:00' start_time = start_time.split(':') hour = int(start_time)[0] minute = int(start_time)[1] second = int(start_time)[2] s = content['s'] # 接收執(zhí)行任務(wù)的各種參數(shù) # 創(chuàng)建任務(wù) scheduler.add_job(test, 'cron', hour=hour, minute=minute, second=second, args=[s]) code = '200' message = 'success' except Exception as e: code = '400' message = e back = { 'code': code, 'message': message } return JsonResponse(json.dumps(data, ensure_ascii=False), safe=False)
# 具體要執(zhí)行的代碼
def test(s):
pass
register_events(scheduler)
scheduler.start()
這樣就可以由前端用戶來手動設(shè)置定時任務(wù)了。
和裝飾器的參數(shù)大同小異,只是第一個參數(shù)不同。
如果具體要執(zhí)行的函數(shù)和調(diào)用它的函數(shù)在一個文件中,那么只需要傳遞這個函數(shù)名就可以了(如上面的例子)。
但是我習(xí)慣將具體的業(yè)務(wù)代碼寫到另外一個文件中,view.py中只寫前后端交互的接口函數(shù),這種情況下傳遞的參數(shù)為一個字符串,格式為:'package.module:some.object',即 包名.模塊:函數(shù)名
django-apscheduler框架還提供了很多操作定時任務(wù)的函數(shù)。比如:
刪除任務(wù)scheduler.remove_job(job_name)
暫停任務(wù)scheduler.pause_job(job_name)
開啟任務(wù)scheduler.resume_job(job_name)
修改任務(wù)scheduler.modify_job(job_name)
注:修改任務(wù)只能修改參數(shù),如果要修改執(zhí)行時間的話,就把任務(wù)刪了重新創(chuàng)建。
可以在頁面上做一個這樣的表格,再加上簡單的前后端交互就可以讓用戶自行管理定時任務(wù):
上述就是小編為大家分享的django中如何使用apscheduler了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。