1. 程式人生 > >django+celery+djcelery 最簡配置

django+celery+djcelery 最簡配置

索引 ↑
包安裝:略

版本

NAME VERSION 備註
celery 3.1
django 1.9
django-celery 3.1

修改的檔案

檔案 作用(詳情看程式碼) 備註
proj/__init__.py 匯入celery.py中的app,來保證只要django啟動就可以用這個app執行shared_task
proj/celery.py 建立一個celery app,以專案名命名
proj/settings.py 主要配置三項東西INSTALLED_APP
,BROKER_URL序列器配置
或者改你指定的配置檔案
demoapp/tasks.py 本文有一些shared_task在裡面

CODE

proj/__init__.py

from __future__ import absolute_import
from .celery import app as celery_app

proj/celery.py

# coding:utf8
from __future__ import absolute_import

import os

from celery import Celery
from
django.conf import settings # set the default Django settings module for the 'celery' program. # 這裡我使用生產的配置,這裡有點瑕疵,不會指定上面匯入的settings,導致開發環境和生產環境沒辦法區分,想到辦法再更新 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.prod_settings') app = Celery('proj') # Using a string here means the worker will not have to
# pickle the object when using Windows. app.config_from_object('django.conf:settings') app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) @app.task(bind=True) def debug_task(self): print('Request: {0!r}'.format(self.request))

proj/prod_settings.py

# 修改點1
INSTALLED_APP += [
    'kombu.transport.django',
    'djcelery'
]
# 修改點2
# 生產環境我使用redis作為broker
BROKER_URL = 'redis://172.23.18.116:6379/0'
# 開發環境可以直接用django作為broker
BROKER_URL = 'django://'

# 修改點3

#: Only add pickle to this list if your broker is secured
#: from unwanted access (see userguide/security.html)
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
# 這裡我注意到的不多,我只知道返回(包括錯誤)是json格式的,輸入貌似也得是

demoapp/tasks.py

from __future__ import absolute_import
from celery import shared_task


@shared_task
def add(x, y):
    return x + y


@shared_task
def mul(x, y):
    return x * y


@shared_task
def xsum(numbers):
    return sum(numbers)

注意

如果INSTALLED_APP裡面註冊app是demoapp,那麼celery任務在import的時候要用(也就是.tasks前面保持一致)

from demoapp.tasks import add, mul, xsum

的方式,不然會出現奇怪的錯誤

使用

首先啟動worker

# 這裡我指定了配置,預設的話忽略info後面
python manage.py celery worker --loglevel=info --settings=proj.prod_settings

然後試著執行shared_task add()

# 同上忽略指定的配置檔案
python manage.py shell --settings=proj.prod_settings

也就是在django環境中執行:

from demoapp.tasks import add
add.delay(4, 4)

上面的worker log中出現add()的return也就是16
說明celery配置完成

django-celery的定時任務功能

說白了就是celery beat定時或者定間隔給celery傳送task
只需配置一項:

# proj/settings.py
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'

然後

python manage.py migrate

然後後臺配置任務執行間隔
再然後:

python manage.py celery beat

可以看到celery beat開始按之前admin後臺設定的時間間隔或者crontab開始傳送taskcelery了,此時自然也需要celery worker在running狀態

celery beat傳送的任務return的結果在celery log中可以看到
說明django-celery 定時任務配置成功