哈嘍,今天給大家分享一篇Django+Celery實現動態配置定時任務,因為最近也是無意間看到一位大佬關於這塊的文章,然后自己覺得不錯,也想學習寫一下,然后最終實現功能是在前端頁面統一管理計划任務,大家可以在admin管理頁面設置,也可以在自己寫的前端頁面刪除添加編輯,實時生效,還可以監控這些監控任務是否運行成功失敗。
補充:如果大家對celery不熟悉的話,建議先學習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.查看生成的表,這幾張表是上面執行命令后生成的

二、配置
1.添加apps
1 INSTALLED_APPS = [ 2 'django.contrib.admin', 3 'django.contrib.auth', 4 'django.contrib.contenttypes', 5 'django.contrib.sessions', 6 'django.contrib.messages', 7 'django.contrib.staticfiles', 8 'djcelery', #這是要添加的 9 ]
2.配置django時區
1 LANGUAGE_CODE = 'en-us' 2 TIME_ZONE = 'Asia/Shanghai' 3 USE_I18N = True 4 USE_L10N = True 5 USE_TZ = False
3.Celery配置
1 BROKER_URL = 'redis://localhost:6379' #代理人 2 CELERY_RESULT_BACKEND = 'redis://localhost:6379' #結果存儲地址 3 CELERY_ACCEPT_CONTENT = ['application/json'] #指定任務接收的內容序列化類型 4 CELERY_TASK_SERIALIZER = 'json' #任務序列化方式 5 CELERY_RESULT_SERIALIZER = 'json' #任務結果序列化方式 6 CELERY_TASK_RESULT_EXPIRES = 12 * 30 #超過時間 7 CELERY_MESSAGE_COMPRESSION = 'zlib' #是否壓縮 8 CELERYD_CONCURRENCY = 4 #並發數默認已CPU數量定 9 CELERYD_PREFETCH_MULTIPLIER = 4 #celery worker 每次去redis取任務的數量 10 CELERYD_MAX_TASKS_PER_CHILD = 3 #每個worker最多執行3個任務就摧毀,避免內存泄漏 11 CELERYD_FORCE_EXECV = True #可以防止死鎖 12 CELERY_ENABLE_UTC = False #關閉時區 13 CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' # 定時任務調度器
4.在你項目的app下面配置celery.py
1 import os 2 from celery import Celery,platforms 3 from django.conf import settings 4 os.environ.setdefault('DJANGO_SETTINGS_MODULE','blog.settings') 5 app = Celery('blog') 6 app.config_from_object('django.conf:settings') 7 app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) 8 platforms.C_FORCE_ROOT = True 9 10 @app.task(bind=True) 11 def debug_task(self): 12 print('Request: {0!r}'.format(self.request))
5.配置剛才app下面的__init__.py文件
1 from __future__ import absolute_import 2 from .celery import app as celery_app
6.在app下面創建一個tasks.py文件
1 from blog.celery import app 2 @app.task() 3 def get_date(x,y,s): #這里的函數留意一下,后面會用到 4 print(s) 5 return x + y 6 7 @app.task() 8 def get_task(): 9 return 'test' 10 11 @app.task() 12 def get_command_task(): 13 return 'success'
三、啟動
1.進入你項目下面,執行啟動worker,Worker是執行任務的單元,它實時監控消息隊列,如果有任務就獲取任務並執行它。
1 celery -A autoops worker -l info
2.進入你項目下面,執行啟動beat,beat是定時把這個任務扔到隊列中
1 celery -A autoops beat -l info
3.啟動你的django項目
1 python manage.py runserver 192.168.10.133:8001
4.頁面展示
4.1這個是admin頁面下的,然后我自己重新寫了,大家也可以自己寫一個,admin和我自己寫的頁面實現的功能其實是一模一樣的。

4.2.對應admin頁面的crontabs

添加周期

編輯修改周期

5.tasks任務
5.1.大家可以看到我添加了一個名為測試的任務,每隔一分鍾執行一次,任務模板其實就是你寫的tasks文件里面函數


看一下worker進程日志輸出

四、監控計划任務
1 pip3 install flower==0.9.2 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com 2 pip install tornado==5.1.1
3 celery flower -A blog --port=5555 #進入項目目錄啟動flower
4.2打開瀏覽器,輸入http://ip:5555 查看

Name: 表示該任務的名稱,默認規則為該函數的路徑規則,例如 {模塊名}.{文件名}.{函數名}
UUID: 表示一個唯一字符串ID用於表示該任務
State: 表示該任務的狀態,包括: SUCCESS / FAILURE / STARTED / RECEIVED
SUCCESS 表示該任務執行完畢且成功
FAILURE 表示該任務執行失敗
STARTED 表示該任務正在執行
RECEIVED 表示該任務在worker中,只是被接收而已
args: 表示該任務的列表參數
kwargs: 表示該任務的字典參數
Result: 表示該任務函數的返回結果
Received: 表示該任務在worker接收到的時間
Started: 表示該任務在worker開始執行的時間
Runtime: 表示該任務在worker真正執行的耗時(單位:秒)
Worker: 表示該任務所在的worker名稱
https://www.cnblogs.com/huangxiaoxue/p/7266253.html 這是那位大佬的文章,可以看看喔。
總結:django+celery實現的定時任務還是不錯的,你可以在前端上查看管理所有定時任務,實時修改生效刪除和禁用,所以有需求的話可以去試試。下次再分享啦
