中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

django中如何使用apscheduler

發布時間:2021-07-30 16:12:35 來源:億速云 閱讀:243 作者:Leah 欄目:大數據

這期內容當中小編將會給大家帶來有關django中如何使用apscheduler,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

Celery框架

定時任務是分布式任務的一種特殊類型的任務。Django的分布式主要由Celery框架實現,這是python開發的分布式任務隊列。由于它本身不支持消息存儲服務,所以需要第三方消息服務來傳遞任務,一般使用Redis

優點:

  1. Celery側重于實時操作,可用于生產系統每天處理數以百萬計的任務,可用于大型項目。

  2. 可在分布的機器、進程、線程上執行任務調度。

缺點:

配置和使用較為復雜,需要Redis數據庫和多個python第三方庫。

django-crontab

只需要下載一個 django-crontab 包就可以使用cron表達式在Django框架中設置定時任務。本人對這種方法了解不多,不過這種方法好像不支持windows系統,功能也相對簡單。

django-apscheduler

配置簡單、功能齊全、使用靈活、支持windows和linux,適合中小型項目。

使用方法

django-apscheduler中相關的概念和python的定時任務框架apscheduler中的概念是一樣的,有感興趣的同學可以自行查閱。

(本文使用 django + mysql 架構)

安裝模塊

pip install django-apscheduler
復制代碼

配置

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

  2. INSTALLED_APPS中加入django-apscheduler應用:






    INSTALLED_APPS = [        ...        'django_apscheduler',        ...    ]
執行遷移

python manage.py migrate
去數據庫中看一看,生成了兩個表格,大部分都顧名思義。

1. django_apscheduler_djangojob

用于存儲任務的表格

django中如何使用apscheduler

job_state: 我猜是將任務具體的執行代碼和參數進行序列化后存在了這里


2. django_apscheduler_djangojobexecution

用于存儲任務執行狀態的表格

django中如何使用apscheduler

status: 執行狀態
duration: 執行了多長時間
exception: 是否出現了什么異常

使用

創建任務

大概有兩種創建任務的方法:裝飾器和add_job函數。

1. 裝飾器

在任意view.py中實現代碼(我習慣新開一個app專門實現定時任務):



















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

  • trigger: 任務執行的方式,共有三種:'date'、'interval'、'cron'。

    • 'date' + 'run_date' 的參數組合, 能實現單次任務
      例子:2019-07-07 22:49:00 執行任務
      @register_job(scheduler, 'date', id='test', run_date='2019-07-07 22:49:00')
      注:在親測時,執行完任務會報錯,原因時執行完任務后會去mysql中刪除djangojob表中的任務。但是djangojobexecution表記錄著執行結果,有外鍵關聯著djangojob表,所以刪除時顯示有外鍵約束錯誤。但是任務會正常執行,執行之后也會正常刪除。

    • 'interval' + 'hours' + 'minutes' + ..... 的參數組合,能實現間隔性任務
      例子:每隔3個半小時執行任務

      還有seconds,days參數可以選擇
      注:如果任務需要執行10秒,而間隔設置為1秒,它是不會給你開10個線程同時去執行10個任務的。它會錯過其他任務直到當前任務完成。

    • @register_job(scheduler, 'interval', id='test', hours=3, minutes=30)

    • 'cron' + 'hour' + 'minute'+...的參數組合,能實現cron類的任務
      例子:每天的8點半執行任務

      還有day,second,month等參數可以選擇。

    • @register_job(scheduler, 'cron', id='test', hour=8, minute=30)

  • id: 任務的名字,不傳的話會自動生成。不過為了之后對任務進行暫停、開啟、刪除等操作,建議給一個名字。并且是唯一的,如果多個任務取一個名字,之前的任務就會被覆蓋。

  • args: list類型。執行代碼所需要的參數。

  • next_run_time:datetime類型。開始執行時間。如果你現在創建一個定時任務,想3天后凌晨三點半自動給你女朋友發微信,那就需要這個參數了。

還有些其他的參數感興趣的同學可以查看源代碼來了解。

2. add_job函數

裝飾器的方法適合于寫代碼的人自己創建任務,如果想讓用戶通過頁面輸入參數,并提交來手動創建定時任務,就需要使用add_job函數。
下面這個小例子,前端傳遞json數據給后端,觸發test_add_task函數,來添加任務:










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())  # 接收參數        try:            start_time = content['start_time']  # 用戶輸入的任務開始時間, '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']  # 接收執行任務的各種參數            # 創建任務            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)

# 具體要執行的代碼






def test(s):    pass    
register_events(scheduler)scheduler.start()
這樣就可以由前端用戶來手動設置定時任務了。
參數

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

其他功能

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

  • 刪除任務
    scheduler.remove_job(job_name)

  • 暫停任務
    scheduler.pause_job(job_name)

  • 開啟任務
    scheduler.resume_job(job_name)

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

可以在頁面上做一個這樣的表格,再加上簡單的前后端交互就可以讓用戶自行管理定時任務:

django中如何使用apscheduler

上述就是小編為大家分享的django中如何使用apscheduler了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永川市| 信阳市| 西和县| 内丘县| 策勒县| 中牟县| 商南县| 淮北市| 阿坝县| 武定县| 沧州市| 常山县| 惠东县| 江口县| 双江| 北安市| 潍坊市| 资兴市| 永胜县| 屯昌县| 清涧县| 大荔县| 澄城县| 牟定县| 太保市| 江永县| 射洪县| 保康县| 双鸭山市| 兰坪| 怀化市| 迁西县| 惠来县| 宁陕县| 泰宁县| 岑巩县| 嘉峪关市| 平阴县| 镇原县| 阜阳市| 竹溪县|