首先是安装这几个三方包,需要注意版本不兼容的情况下可能会报如下错误: AttributeError: 'str' object has no attribute 'items'
这种情况是redis版本问题:若redis=3.2.0,降低版本redis=2.10.6即可解决,下面给出我使用的版本:
pip install redis==2.10.6
pip install django-celery==3.1.17
pip install celery==3.1.23
首先可以在settings.py配置文件中首先需要添加如下两段配置:
1、INSTALLED_APPS 中需添加djcelery
INSTALLED_APPS = (
……
'djcelery'
……
)
2、启动及配置地址
import djcelery
djcelery.setup_loader()
BROKER_URL= '你的broker消息队列如RabbitMQ、Redis地址'
CELERY_RESULT_BACKEND = ‘结果接收地址’
之后可以创建一个异步任务task.py文件,其中需要如下配置:
app = Celery('tasks', backend=CELERY_RESULT_BACKEND, broker=BROKER_URL)
@app.task
def your_task():
...
return ...
也可以不配置settings.py文件直接在task.py文件中如下配置:
from celery import Celery
brokers = 'redis://127.0.0.1:6379/5'
backend = 'redis://127.0.0.1:6379/6'
app = Celery('tasks', broker=broker, backend=backend)
@app.task
def your_task():
...
return ...
需要注意的是在views中调用该方法时需要在该方法后添加delay方法才能够进行异步调用
your_task.delay()
然后使用如下命令启动即可
#先启动服务器
python manage.py runserver
#再启动worker
python manage.py celery worker -l info
创建定时任务需要配置CELERYBEAT_SCHEDULE,如下使用datetime模块下的timedelta实现定时任务(每30s执行一次)
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/5'
BROKER_URL = 'redis://127.0.0.1:6379/6'
CELERY_TIMEZONE = 'Asia/Shanghai'
from datetime import timedelta
CELERYBEAT_SCHEDULE = {
'add-every-30-seconds': {
'task': 'proj.tasks.add',
'schedule': timedelta(seconds=30),
'args': (16, 16)
},
}
也可以使用celery模块下的crontab实现(每周一上午7:30执行一次)
from celery.schedules import crontab
CELERYBEAT_SCHEDULE = {
# Executes every Monday morning at 7:30 A.M
'add-every-monday-morning': {
'task': 'tasks.add',
'schedule': crontab(hour=7, minute=30, day_of_week=1),
'args': (16, 16),
},
}
启动服务后需要启动beat才能够启动
python manage.py celery beat -l info
1、启动时报错AttributeError: ‘str’ object has no attribute 'items
2、异步任务队列Celery在Django中的使用
3、异步任务神器 Celery 简明笔记
4、Celery定时任务