django中celery的配置及使用
celery 涉及到三個東西:非同步的專案、worker(執行非同步任務的程序,其作用是從redis中獲取非同步任務並執行)、broker(代理人,這裡用redis做broker,其作用是將需要執行非同步或定時任務新增到redis佇列中)
Celery大於3.1.25的版本不再支援Windows。Windows下推薦安裝 3.1.25。(因為我使用的 Windows,這裡就以3.1.25為例)
一、安裝django-celery和django-redis pip install django-celery django-redis
二、INSTALLED_APPS中加入 djcelery
INSTALLED_APPS = [
...
'djcelery', #加入djcelery
]
三、在settings.py 中加入celery配置資訊
######django-celery配置###### import djcelery from celery.schedules import timedelta,crontab djcelery.setup_loader() # 開始載入當前所有安裝app中的task # 使用redis代理來分發任務 BROKER_URL = 'redis://127.0.0.1:6379/8' CELERY_IMPORTS = ('post.tasks') # 匯入任務,可以執行的非同步任務 CELERY_TIMEZONE = 'Asia/Shanghai' # 中國時區 # 任務存入到資料庫中 CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' # 定時器策略 CELERYBEAT_SCHEDULE = { # 定時任務一:每隔30s執行一次 u'郵件傳送': { "task": "post.tasks.tsend_email", # 有必要注意該位置的post指tasks.py所在資料夾tsend_email為非同步函式之一 # "schedule": crontab(minute='*/2'), "schedule": timedelta(seconds=5), "args": (), }, u'效能計算': { "task": "post.tasks.add", "schedule": crontab(minute='*/2'), "args": (1, 4), }, } #####django-celery end########
四、在主工程目錄新增celery.py
# encoding: utf-8 from __future__ import absolute_import # 避免就近原則 import os from celery import Celery from django.conf import settings # 設定專案執行的環境變數DJANGO_SETTINGS_MODULE os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DAdmin.settings") # DAdmin為settings所在的檔案(模組) #建立celery應用 app = Celery('AdminCelery') # Celery載入配置 app.config_from_object('django.conf:settings') # 如果在工程的應用中建立了tasks.py模組,那麼Celery應用就會自動去檢索建立的任務。 # 比如你添加了一個任務,在django中會實時地檢索出來。 app.autodiscover_tasks(lambda :settings.INSTALLED_APPS)
五、在自己的app中建立任務 tasks.py
# coding:utf-8
import time
from DAdmin.celery import app #匯入celery的例項物件
@app.task
def tsend_email():
time.sleep(10)
print('send email ok!')
@app.task
def add(x, y):
time.sleep(5)
return x+y
六、遷移生成celery需要的資料表(必做的步驟)
在終端輸入 python manage.py makemigrations 做遷移計劃並通過 python manage.py migrate 遷移至mysql資料庫
七、在views.py中的某一請求處理函式中,呼叫tasks.py中任務(函式名.delay(對應函式的引數)這是呼叫的格式)
from post.tasks import tsend_email,add
def sendmail(request):
...
tsend_email.delay() # 執行任務
# add.delay(1,2) # delay(add函式的引數列表)
return HttpResponse(json.dumps({'status':'ok'}), 'application/json')
八、啟動相關服務
先啟動專案 python manage.py runserver
再啟動celery ① python manage.py celery worker -l info (不會啟動定時任務)
② python manage.py celery -A 專案名 worker -B -l info (預設會主動 啟動 專案名.celery,即會啟動定時任務,其中-B在windows上不支援)
③ 如果在windows下可以分開啟動 非同步任務的啟動命令為①或者celery -A 專案名 worker -l info,定時任務的啟動命令為 python manage.py celery -A 專案名 beat -l info 或者 celery -A 專案名 beat -l info(均親測有效)