1. 程式人生 > 程式設計 >Django+Celery實現動態配置定時任務的方法示例

Django+Celery實現動態配置定時任務的方法示例

哈嘍,今天給大家分享一篇Django+Celery實現動態配置定時任務,因為最近也是無意間看到一位大佬關於這塊的文章,然後自己覺得不錯,也想學習寫一下,然後最終實現功能是在前端頁面統一管理計劃任務,大家可以在admin管理頁面設定,也可以在自己寫的前端頁面刪除新增編輯,實時生效,還可以監控這些監控任務是否執行成功失敗。

補充:如果大家對celery不熟悉的話,建議先學習celery

Django+Celery實現動態配置定時任務的方法示例

一、安裝

1.在Linux系統上安裝模組

celery (3.1.26.post2)
celery-with-redis (3.0)
redis (2.10.6)
Django (2.1.10)
django-celery (3.3.1)

2.遷移生成表

python manage.py migrate

3.檢視生成的表,這幾張表是上面執行命令後生成的

Django+Celery實現動態配置定時任務的方法示例

二、配置

1.新增apps

INSTALLED_APPS = [
  'django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','djcelery',#這是要新增的
]

2.配置django時區

LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False

3.Celery配置

BROKER_URL = 'redis://localhost:6379' #代理人
CELERY_RESULT_BACKEND = 'redis://localhost:6379' #結果儲存地址
CELERY_ACCEPT_CONTENT = ['application/json'] #指定任務接收的內容序列化型別
CELERY_TASK_SERIALIZER = 'json' #任務序列化方式
CELERY_RESULT_SERIALIZER = 'json' #任務結果序列化方式
CELERY_TASK_RESULT_EXPIRES = 12 * 30 #超過時間
CELERY_MESSAGE_COMPRESSION = 'zlib' #是否壓縮
CELERYD_CONCURRENCY = 4 #併發數預設已CPU數量定
CELERYD_PREFETCH_MULTIPLIER = 4 #celery worker 每次去redis取任務的數量
CELERYD_MAX_TASKS_PER_CHILD = 3 #每個worker最多執行3個任務就摧毀,避免記憶體洩漏
CELERYD_FORCE_EXECV = True #可以防止死鎖
CELERY_ENABLE_UTC = False #關閉時區
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' # 定時任務排程器

4.在你專案的app下面配置celery.py

import os
from celery import Celery,platforms
from django.conf import settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE','blog.settings')
app = Celery('blog')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
platforms.C_FORCE_ROOT = True

@app.task(bind=True)
def debug_task(self):
  print('Request: {0!r}'.format(self.request))

5.配置剛才app下面的__init__.py檔案

from __future__ import absolute_import
from .celery import app as celery_app

6.在app下面建立一個tasks.py檔案

from blog.celery import app
@app.task()
def get_date(x,y,s):  #這裡的函式留意一下,後面會用到
  print(s)
  return x + y

@app.task()
def get_task():
  return 'test'

@app.task()
def get_command_task():
  return 'success'

三、啟動

1.進入你專案下面,執行啟動worker,Worker是執行任務的單元,它實時監控訊息佇列,如果有任務就獲取任務並執行它。

celery -A autoops worker -l info

2.進入你專案下面,執行啟動beat,beat是定時把這個任務扔到佇列中

celery -A autoops beat -l info  

3.啟動你的django專案

python manage.py runserver 192.168.10.133:8001

4.頁面展示

4.1這個是admin頁面下的,然後我自己重新寫了,大家也可以自己寫一個,admin和我自己寫的頁面實現的功能其實是一模一樣的。

Django+Celery實現動態配置定時任務的方法示例

4.2.對應admin頁面的crontabs

Django+Celery實現動態配置定時任務的方法示例

新增週期

Django+Celery實現動態配置定時任務的方法示例

編輯修改週期

Django+Celery實現動態配置定時任務的方法示例

5.tasks任務

5.1.大家可以看到我添加了一個名為測試的任務,每隔一分鐘執行一次,任務模板其實就是你寫的tasks檔案裡面函式

Django+Celery實現動態配置定時任務的方法示例

Django+Celery實現動態配置定時任務的方法示例

看一下worker程序日誌輸出

Django+Celery實現動態配置定時任務的方法示例

四、監控計劃任務

celery作為一個分散式非同步任務佇列管理工具,通過介面化的方式來進行管控任務的執行狀態和檢視任務執行結果

flower作為web頁面來管理celery後臺任務,和任務佇列是隔離的,也就是flower的執行與否並不會影響到任務佇列的真正執行,但是flower中可以通過API介面來管理celery中的任務執行。

4.1安裝flower,監控celery計劃任務

pip3 install flower==0.9.2 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
pip install tornado==5.1.1
celery flower -A blog --port=5555 #進入專案目錄啟動flower

4.2開啟瀏覽器,輸入http://ip:5555 檢視

Django+Celery實現動態配置定時任務的方法示例

Name: 表示該任務的名稱,預設規則為該函式的路徑規則,例如 {模組名}.{檔名}.{函式名}
UUID: 表示一個唯一字串ID用於表示該任務
State: 表示該任務的狀態,包括: SUCCESS / FAILURE / STARTED / RECEIVED
SUCCESS 表示該任務執行完畢且成功
FAILURE 表示該任務執行失敗
STARTED 表示該任務正在執行
RECEIVED 表示該任務在worker中,只是被接收而已
args: 表示該任務的列表引數
kwargs: 表示該任務的字典引數
Result: 表示該任務函式的返回結果
Received: 表示該任務在worker接收到的時間
Started: 表示該任務在worker開始執行的時間
Runtime: 表示該任務在worker真正執行的耗時(單位:秒)
Worker: 表示該任務所在的worker名稱

總結:django+celery實現的定時任務還是不錯的,你可以在前端上檢視管理所有定時任務,實時修改生效刪除和禁用,所以有需求的話可以去試試。下次再分享啦

到此這篇關於Django+Celery實現動態配置定時任務的方法示例的文章就介紹到這了,更多相關Django Celery動態配置定時任務內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!