一、首先看下Celery的工作框架:
二、介绍下配置文件:
1、首先安装一些组件库:
pip install celery
pip install celery-with-redis
pip install django-celery
sudo apt install redis-server
2、进行一些配置:
a、配置setting.py中的INSTALLED_APPS ,加入djcelery
# setting.py配置:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 自己的app
't8',
# 第三方给定的
'djcelery',
]
b、配置taskconfig文件后面的app.config_from_object('taskconfig')会用到:
# celery配置
import djcelery
djcelery.setup_loader() #会自动加载INSTALL_APPS中项目的tasks.py文件中的task任务
BROKER_URL='redis://127.0.0.1:6379/1' # localhost
CELERY_CONCURRENCY=2 #(设置worker的并发数量)
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/2' # localhost
c、配置celery.py文件:
# celery.py配置
from __future__ import absolute_import
from celery import Celery
from django.conf import settings
import os
# 设置系统的环境配置用的是Django的
os.environ.setdefault('DJANGO_SETTING_MODEULE','工程名字.settings')
# 实例化celery
app = Celery('mycelery')
# APP设置时区
app.conf.timezone = "Asia/Shanghai"
# 指定celery的配置来源 用的是项目的配置文件settings.py
app.config_from_object("django.conf:settings")
# 让celery自动去发现我们的任务(task)
app.autodiscover_tasks(lambda : settings.INSTALLED_APPS)
# 你需要在app目录下新建一个叫tasks.py(不能写错) 文件
或者:
from __future__ import absolute_import
import os
from celery import Celery, platforms
from django.conf import settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'zp.settings')
# pylint: disable=C0103
app = Celery('celery_task')
#这个用的就是taskconfig文件中的配置文件见设置b
app.config_from_object('taskconfig')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
platforms.C_FORCE_ROOT = True
三、实践及命令配置:
这里还有一些高级配置项,包括队列的选择:
https://www.cnblogs.com/blackmatrix/p/8950381.html
这里举个例子说明:
1、设置的队列如下
CELERY_QUEUES = {
"zp": {
"exchange": "zp",
"exchange_type": "direct",
"routing_key": "zp"
},
"task": {
"routing_key": "taskq",
"exchange_type": "direct",
"exchange": "taskq",
}
}
2、设置不同的task任务对应的队列关系:
LCM_ROUTE_MAP = {'docker': {'queue': 'aa', 'routing_key': 'bb'},
'paas': {'queue': 'aa', 'routing_key': 'vv'}}
CELERY_ROUTES = {
'zpa.tasks.run': {'queueA': 'task', 'routing_key': 'task'},
'zpa.tasks.run_a': {'queue': 'zpa', 'routing_key': 'zpa'}
}
鉴于1、2可以看出,对于task.run的celery任务,会放到task队列中的celerywork去执行,那怎么配置worker对应的queue呢?见第三步:
3、创建celery worker:
python manage.py celery worker -A zp.celery_task -P gevent -c 100 -n task_worker -Ofair -l error -Q task -f test_celery.log
其中,-Q指出该celery任务会去broker中的queue为task中的任务去执行,-n task_worker表示celery名称为task_worker,-A为app的意思,-P gevent代表以gevent(协程)的模式运行,-c代表并发量为100
gevent相关的知识可以参考:https://blog.csdn.net/yueguanghaidao/article/details/24281751