溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Django+Celery如何實(shí)現(xiàn)動(dòng)態(tài)配置定時(shí)任務(wù)

發(fā)布時(shí)間:2020-07-22 10:24:02 來源:億速云 閱讀:431 作者:小豬 欄目:開發(fā)技術(shù)

這篇文章主要講解了Django+Celery如何實(shí)現(xiàn)動(dòng)態(tài)配置定時(shí)任務(wù),內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。

哈嘍,今天給大家分享一篇Django+Celery實(shí)現(xiàn)動(dòng)態(tài)配置定時(shí)任務(wù),因?yàn)樽罱彩菬o(wú)意間看到一位大佬關(guān)于這塊的文章,然后自己覺得不錯(cuò),也想學(xué)習(xí)寫一下,然后最終實(shí)現(xiàn)功能是在前端頁(yè)面統(tǒng)一管理計(jì)劃任務(wù),大家可以在admin管理頁(yè)面設(shè)置,也可以在自己寫的前端頁(yè)面刪除添加編輯,實(shí)時(shí)生效,還可以監(jiān)控這些監(jiān)控任務(wù)是否運(yùn)行成功失敗。

補(bǔ)充:如果大家對(duì)celery不熟悉的話,建議先學(xué)習(xí)celery

Django+Celery如何實(shí)現(xiàn)動(dòng)態(tài)配置定時(shí)任務(wù)

一、安裝

1.在Linux系統(tǒng)上安裝模塊

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.查看生成的表,這幾張表是上面執(zhí)行命令后生成的

Django+Celery如何實(shí)現(xiàn)動(dòng)態(tài)配置定時(shí)任務(wù)

二、配置

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時(shí)區(qū)

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' #結(jié)果存儲(chǔ)地址
CELERY_ACCEPT_CONTENT = ['application/json'] #指定任務(wù)接收的內(nèi)容序列化類型
CELERY_TASK_SERIALIZER = 'json' #任務(wù)序列化方式
CELERY_RESULT_SERIALIZER = 'json' #任務(wù)結(jié)果序列化方式
CELERY_TASK_RESULT_EXPIRES = 12 * 30 #超過時(shí)間
CELERY_MESSAGE_COMPRESSION = 'zlib' #是否壓縮
CELERYD_CONCURRENCY = 4 #并發(fā)數(shù)默認(rèn)已CPU數(shù)量定
CELERYD_PREFETCH_MULTIPLIER = 4 #celery worker 每次去redis取任務(wù)的數(shù)量
CELERYD_MAX_TASKS_PER_CHILD = 3 #每個(gè)worker最多執(zhí)行3個(gè)任務(wù)就摧毀,避免內(nèi)存泄漏
CELERYD_FORCE_EXECV = True #可以防止死鎖
CELERY_ENABLE_UTC = False #關(guān)閉時(shí)區(qū)
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' # 定時(shí)任務(wù)調(diào)度器

4.在你項(xiàng)目的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下面創(chuàng)建一個(gè)tasks.py文件

from blog.celery import app
@app.task()
def get_date(x,y,s):  #這里的函數(shù)留意一下,后面會(huì)用到
  print(s)
  return x + y

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

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

三、啟動(dòng)

1.進(jìn)入你項(xiàng)目下面,執(zhí)行啟動(dòng)worker,Worker是執(zhí)行任務(wù)的單元,它實(shí)時(shí)監(jiān)控消息隊(duì)列,如果有任務(wù)就獲取任務(wù)并執(zhí)行它。

celery -A autoops worker -l info

2.進(jìn)入你項(xiàng)目下面,執(zhí)行啟動(dòng)beat,beat是定時(shí)把這個(gè)任務(wù)扔到隊(duì)列中

celery -A autoops beat -l info  

3.啟動(dòng)你的django項(xiàng)目

python manage.py runserver 192.168.10.133:8001

4.頁(yè)面展示

4.1這個(gè)是admin頁(yè)面下的,然后我自己重新寫了,大家也可以自己寫一個(gè),admin和我自己寫的頁(yè)面實(shí)現(xiàn)的功能其實(shí)是一模一樣的。

Django+Celery如何實(shí)現(xiàn)動(dòng)態(tài)配置定時(shí)任務(wù)

4.2.對(duì)應(yīng)admin頁(yè)面的crontabs

Django+Celery如何實(shí)現(xiàn)動(dòng)態(tài)配置定時(shí)任務(wù)

添加周期

Django+Celery如何實(shí)現(xiàn)動(dòng)態(tài)配置定時(shí)任務(wù)

編輯修改周期

Django+Celery如何實(shí)現(xiàn)動(dòng)態(tài)配置定時(shí)任務(wù)

5.tasks任務(wù)

5.1.大家可以看到我添加了一個(gè)名為測(cè)試的任務(wù),每隔一分鐘執(zhí)行一次,任務(wù)模板其實(shí)就是你寫的tasks文件里面函數(shù)

Django+Celery如何實(shí)現(xiàn)動(dòng)態(tài)配置定時(shí)任務(wù)

Django+Celery如何實(shí)現(xiàn)動(dòng)態(tài)配置定時(shí)任務(wù)

看一下worker進(jìn)程日志輸出

Django+Celery如何實(shí)現(xiàn)動(dòng)態(tài)配置定時(shí)任務(wù)

四、監(jiān)控計(jì)劃任務(wù)

celery作為一個(gè)分布式異步任務(wù)隊(duì)列管理工具,通過界面化的方式來進(jìn)行管控任務(wù)的執(zhí)行狀態(tài)和查看任務(wù)執(zhí)行結(jié)果

flower作為web頁(yè)面來管理celery后臺(tái)任務(wù),和任務(wù)隊(duì)列是隔離的,也就是flower的運(yùn)行與否并不會(huì)影響到任務(wù)隊(duì)列的真正執(zhí)行,但是flower中可以通過API接口來管理celery中的任務(wù)執(zhí)行。

4.1安裝flower,監(jiān)控celery計(jì)劃任務(wù)

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 #進(jìn)入項(xiàng)目目錄啟動(dòng)flower

4.2打開瀏覽器,輸入http://ip:5555 查看

Django+Celery如何實(shí)現(xiàn)動(dòng)態(tài)配置定時(shí)任務(wù)

Name: 表示該任務(wù)的名稱,默認(rèn)規(guī)則為該函數(shù)的路徑規(guī)則,例如 {模塊名}.{文件名}.{函數(shù)名}
UUID: 表示一個(gè)唯一字符串ID用于表示該任務(wù)
State: 表示該任務(wù)的狀態(tài),包括: SUCCESS / FAILURE / STARTED / RECEIVED
SUCCESS 表示該任務(wù)執(zhí)行完畢且成功
FAILURE 表示該任務(wù)執(zhí)行失敗
STARTED 表示該任務(wù)正在執(zhí)行
RECEIVED 表示該任務(wù)在worker中,只是被接收而已
args: 表示該任務(wù)的列表參數(shù)
kwargs: 表示該任務(wù)的字典參數(shù)
Result: 表示該任務(wù)函數(shù)的返回結(jié)果
Received: 表示該任務(wù)在worker接收到的時(shí)間
Started: 表示該任務(wù)在worker開始執(zhí)行的時(shí)間
Runtime: 表示該任務(wù)在worker真正執(zhí)行的耗時(shí)(單位:秒)
Worker: 表示該任務(wù)所在的worker名稱

看完上述內(nèi)容,是不是對(duì)Django+Celery如何實(shí)現(xiàn)動(dòng)態(tài)配置定時(shí)任務(wù)有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI