真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

django中如何使用apscheduler

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)django中如何使用apscheduler,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

成都創(chuàng)新互聯(lián)認(rèn)為,企業(yè)網(wǎng)站是要賦予品質(zhì)、思維、人性,深入到用戶內(nèi)心的細(xì)膩情感,才能真正稱得上企業(yè)網(wǎng)站。成都創(chuàng)新互聯(lián)根據(jù)每位用戶內(nèi)心最深的需求網(wǎng)站建設(shè)服務(wù),堅(jiān)實(shí)的設(shè)計(jì)執(zhí)行是品牌長(zhǎng)期視覺(jué)塑造的重要支持。

Celery框架

定時(shí)任務(wù)是分布式任務(wù)的一種特殊類型的任務(wù)。Django的分布式主要由Celery框架實(shí)現(xiàn),這是python開(kāi)發(fā)的分布式任務(wù)隊(duì)列。由于它本身不支持消息存儲(chǔ)服務(wù),所以需要第三方消息服務(wù)來(lái)傳遞任務(wù),一般使用redis。

優(yōu)點(diǎn):

  1. Celery側(cè)重于實(shí)時(shí)操作,可用于生產(chǎn)系統(tǒng)每天處理數(shù)以百萬(wàn)計(jì)的任務(wù),可用于大型項(xiàng)目。

  2. 可在分布的機(jī)器、進(jìn)程、線程上執(zhí)行任務(wù)調(diào)度。

缺點(diǎn):

配置和使用較為復(fù)雜,需要Redis數(shù)據(jù)庫(kù)和多個(gè)python第三方庫(kù)。

django-crontab

只需要下載一個(gè) django-crontab 包就可以使用cron表達(dá)式在Django框架中設(shè)置定時(shí)任務(wù)。本人對(duì)這種方法了解不多,不過(guò)這種方法好像不支持windows系統(tǒng),功能也相對(duì)簡(jiǎn)單。

django-apscheduler

配置簡(jiǎn)單、功能齊全、使用靈活、支持windows和linux,適合中小型項(xiàng)目。

使用方法

django-apscheduler中相關(guān)的概念和python的定時(shí)任務(wù)框架apscheduler中的概念是一樣的,有感興趣的同學(xué)可以自行查閱。

(本文使用 django + MySQL 架構(gòu))

安裝模塊

pip install django-apscheduler
復(fù)制代碼

配置

  1. 先在settings.py中配置好數(shù)據(jù)庫(kù)信息(略).

  2. INSTALLED_APPS中加入django-apscheduler應(yīng)用:

    INSTALLED_APPS = [        ...        'django_apscheduler',        ...    ]
執(zhí)行遷移
python manage.py migrate
去數(shù)據(jù)庫(kù)中看一看,生成了兩個(gè)表格,大部分都顧名思義。
1. django_apscheduler_djangojob

用于存儲(chǔ)任務(wù)的表格

django中如何使用apscheduler

job_state: 我猜是將任務(wù)具體的執(zhí)行代碼和參數(shù)進(jìn)行序列化后存在了這里

2. django_apscheduler_djangojobexecution

用于存儲(chǔ)任務(wù)執(zhí)行狀態(tài)的表格

django中如何使用apscheduler

status: 執(zhí)行狀態(tài)
duration: 執(zhí)行了多長(zhǎng)時(shí)間
exception: 是否出現(xiàn)了什么異常

使用

創(chuàng)建任務(wù)

大概有兩種創(chuàng)建任務(wù)的方法:裝飾器和add_job函數(shù)。

1. 裝飾器

在任意view.py中實(shí)現(xiàn)代碼(我習(xí)慣新開(kāi)一個(gè)app專門(mén)實(shí)現(xiàn)定時(shí)任務(wù)):


from apscheduler.schedulers.background import BackgroundSchedulerfrom django_apscheduler.jobstores import DjangoJobStore, register_events, register_job
# 實(shí)例化調(diào)度器scheduler = BackgroundScheduler()# 調(diào)度器使用默認(rèn)的DjangoJobStore()scheduler.add_jobstore(DjangoJobStore(), 'default')
# 每天8點(diǎn)半執(zhí)行這個(gè)任務(wù)@register_job(scheduler, 'cron', id='test', hour=8, minute=30,args=['test'])def test(s):    # 具體要執(zhí)行的代碼    pass
# 注冊(cè)定時(shí)任務(wù)并開(kāi)始register_events(scheduler)scheduler.start()
啟動(dòng)服務(wù) python manage.py runserver 這個(gè)任務(wù)就會(huì)被存儲(chǔ)到django_apscheduler_djangojob表中,并按照設(shè)置定時(shí)的執(zhí)行程序。
參數(shù)
  • scheduler: 指定調(diào)度器

  • trigger: 任務(wù)執(zhí)行的方式,共有三種:'date'、'interval'、'cron'。

    • 'date' + 'run_date' 的參數(shù)組合, 能實(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')
      注:在親測(cè)時(shí),執(zhí)行完任務(wù)會(huì)報(bào)錯(cuò),原因時(shí)執(zhí)行完任務(wù)后會(huì)去mysql中刪除djangojob表中的任務(wù)。但是djangojobexecution表記錄著執(zhí)行結(jié)果,有外鍵關(guān)聯(lián)著djangojob表,所以刪除時(shí)顯示有外鍵約束錯(cuò)誤。但是任務(wù)會(huì)正常執(zhí)行,執(zhí)行之后也會(huì)正常刪除。

    • 'interval' + 'hours' + 'minutes' + ..... 的參數(shù)組合,能實(shí)現(xiàn)間隔性任務(wù)。
      例子:每隔3個(gè)半小時(shí)執(zhí)行任務(wù)

      還有seconds,days參數(shù)可以選擇
      注:如果任務(wù)需要執(zhí)行10秒,而間隔設(shè)置為1秒,它是不會(huì)給你開(kāi)10個(gè)線程同時(shí)去執(zhí)行10個(gè)任務(wù)的。它會(huì)錯(cuò)過(guò)其他任務(wù)直到當(dāng)前任務(wù)完成。

    • @register_job(scheduler, 'interval', id='test', hours=3, minutes=30)
    • 'cron' + 'hour' + 'minute'+...的參數(shù)組合,能實(shí)現(xiàn)cron類的任務(wù)。
      例子:每天的8點(diǎn)半執(zhí)行任務(wù)

      還有day,second,month等參數(shù)可以選擇。

    • @register_job(scheduler, 'cron', id='test', hour=8, minute=30)
  • id: 任務(wù)的名字,不傳的話會(huì)自動(dòng)生成。不過(guò)為了之后對(duì)任務(wù)進(jìn)行暫停、開(kāi)啟、刪除等操作,建議給一個(gè)名字。并且是唯一的,如果多個(gè)任務(wù)取一個(gè)名字,之前的任務(wù)就會(huì)被覆蓋。

  • args: list類型。執(zhí)行代碼所需要的參數(shù)。

  • next_run_time:datetime類型。開(kāi)始執(zhí)行時(shí)間。如果你現(xiàn)在創(chuàng)建一個(gè)定時(shí)任務(wù),想3天后凌晨三點(diǎn)半自動(dòng)給你女朋友發(fā)微信,那就需要這個(gè)參數(shù)了。

還有些其他的參數(shù)感興趣的同學(xué)可以查看源代碼來(lái)了解。

2. add_job函數(shù)

裝飾器的方法適合于寫(xiě)代碼的人自己創(chuàng)建任務(wù),如果想讓用戶通過(guò)頁(yè)面輸入?yún)?shù),并提交來(lái)手動(dòng)創(chuàng)建定時(shí)任務(wù),就需要使用add_job函數(shù)。
下面這個(gè)小例子,前端傳遞json數(shù)據(jù)給后端,觸發(fā)test_add_task函數(shù),來(lái)添加任務(wù):


import jsonfrom django.http import JsonResponsefrom apscheduler.schedulers.background import BackgroundSchedulerfrom 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ù)開(kāi)始時(shí)間, '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']  # 接收?qǐng)?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()
這樣就可以由前端用戶來(lái)手動(dòng)設(shè)置定時(shí)任務(wù)了。
參數(shù)

和裝飾器的參數(shù)大同小異,只是第一個(gè)參數(shù)不同。
如果具體要執(zhí)行的函數(shù)和調(diào)用它的函數(shù)在一個(gè)文件中,那么只需要傳遞這個(gè)函數(shù)名就可以了(如上面的例子)。
但是我習(xí)慣將具體的業(yè)務(wù)代碼寫(xiě)到另外一個(gè)文件中,view.py中只寫(xiě)前后端交互的接口函數(shù),這種情況下傳遞的參數(shù)為一個(gè)字符串,格式為:'package.module:some.object',即 包名.模塊:函數(shù)名

其他功能

django-apscheduler框架還提供了很多操作定時(shí)任務(wù)的函數(shù)。比如:

  • 刪除任務(wù)
    scheduler.remove_job(job_name)

  • 暫停任務(wù)
    scheduler.pause_job(job_name)

  • 開(kāi)啟任務(wù)
    scheduler.resume_job(job_name)

  • 修改任務(wù)
    scheduler.modify_job(job_name)
    注:修改任務(wù)只能修改參數(shù),如果要修改執(zhí)行時(shí)間的話,就把任務(wù)刪了重新創(chuàng)建。

可以在頁(yè)面上做一個(gè)這樣的表格,再加上簡(jiǎn)單的前后端交互就可以讓用戶自行管理定時(shí)任務(wù):

django中如何使用apscheduler

上述就是小編為大家分享的django中如何使用apscheduler了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


文章題目:django中如何使用apscheduler
路徑分享:http://weahome.cn/article/gghchs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部