1. 程式人生 > >django中celery的配置及使用

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(均親測有效)