由于django-celery这个模块我在django1.10的版本内运行不起来,只能使用野生的Celery,Celery4支持django1.8以上的版本,1.8以下的版本请使用Celery3,整个配置过程并不复杂:


整个目录结构:

wKioL1iBywTB1qJAAAAXihfUleg838.png-wh_50


一、安装模块:

1
2
pip install celery
pip install django-celery-results

django-celery-results作用是将Celery的运行结果存入数据库


二、建立Celery入口文件(celery.py):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
 
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE''Mir2Admin.settings')
 
app = Celery('Mir2Admin')
 
# Using a string here means the worker don't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
 
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()
 
 
@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))


三、把celery.py中的app加入__init__.py文件中,确保django运行的时候加载到它:

1
2
3
4
5
6
7
from __future__ import absolute_import, unicode_literals
 
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app
 
__all__ = ['celery_app']


四、配置settting.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# celery配置
CELERY_BROKER_URL = 'redis://:lihuipeng@192.168.x.x:6379/3'
 
#: Only add pickle to this list if your broker is secured
#: from unwanted access (see userguide/security.html)
CELERY_ACCEPT_CONTENT = ['json']
CELERY_RESULT_BACKEND = 'django-db'
CELERY_TASK_SERIALIZER = 'json'
 
INSTALLED_APPS = [
    ......
    'django_celery_results',
    ......
]

我的broker用redis,没有redis的google撸一个

CELERY_RESULT_BACKEND这一项只有装了django-celery-results这个模块这里才能配置'django-db',把结果存入数据库


五、生成数据表:

1
migrate django_celery_results


六、在自己的app中建立tasks.py文件,添加需要异步执行的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Create your tasks here
from __future__ import absolute_import, unicode_literals
from celery import shared_task
 
 
@shared_task
def add(x, y):
    return + y
 
 
@shared_task
def mul(x, y):
    return * y
 
 
@shared_task
def xsum(numbers):
    return sum(numbers)


五、启动测试(在django工程的manage.py同层目录执行):

1
/usr/local/python27/bin/celery -A Mir2Admin worker -l info


六、简单测试:

1
2
3
python manage.py shell    
>>> from myapp.tasks import add    
>>> add.delay(2, 2)

从第五步的前台日志可以看到Celery执行结果,django-celery-results会把结果存进数据库

wKioL1iBz9yB7ZEfAABFkTb1oaI012.png-wh_50


七、生产环境配置(附件):


添加启动脚本:

1
chmod +x /etc/init.d/celeryd


添加配置文(/etc/default/celeryd):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# Names of nodes to start
#   most people will only start one node:
CELERYD_NODES="Mir2AdminCelery"
#   but you can also start multiple and configure settings
#   for each in CELERYD_OPTS
#CELERYD_NODES="worker1 worker2 worker3"
#   alternatively, you can specify the number of nodes to start:
#CELERYD_NODES=10
 
# Absolute or relative path to the 'celery' command:
CELERY_BIN="/usr/local/python27/bin/celery"
 
# App instance to use
# comment out this line if you don't use an app
CELERY_APP="Mir2Admin"
# or fully qualified:
#CELERY_APP="proj.tasks:app"
 
# Where to chdir at start.
CELERYD_CHDIR="/data/www/Mir2Admin"
 
# Extra command-line arguments to the worker
CELERYD_OPTS="--time-limit=300 --concurrency=8"
# Configure node-specific settings by appending node name to arguments:
#CELERYD_OPTS="--time-limit=300 -c 8 -c:worker2 4 -c:worker3 2 -Ofair:worker1"
 
# Set logging level to DEBUG
#CELERYD_LOG_LEVEL="DEBUG"
 
# %n will be replaced with the first part of the nodename.
CELERYD_LOG_FILE="/data/www/Mir2Admin/logs/%n%I.log"
CELERYD_PID_FILE="/data/www/Mir2Admin/%n.pid"
 
# Workers should run as an unprivileged user.
#   You need to create this user manually (or you can choose
#   a user/group combination that already exists (e.g., nobody).
CELERYD_USER="root"
CELERYD_GROUP="root"
 
# If enabled pid and log directories will be created if missing,
# and owned by the userid/group configured.
CELERY_CREATE_DIRS=1

CELERYD_NODES:名称,影响日志文件名及pid文件名

CELERY_BIN:celery路径

CELERY_APP:django工程名称

CELERYD_CHDIR:django工程路径

CELERYD_OPTS:参数

CELERYD_LOG_FILE:日志路径

CELERYD_PID_FILE:PID文件路径


最后启动一发:

1
/etc/init.d/celeryd start



参考文章:http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html