版本:
- Django 2.0.1
- django-celery 3.3.0
- redis 2.10.0
celeryconfig.py
与settings.py同级
from datetime import timedelta
import djcelery
djcelery.setup_loader()
BROKER_BACKEND = 'redis'
BROKER_URL = 'redis://localhost:6379/1'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/2'
CELERY_QUEUES = {
'beat_tasks':{
'exchange':"beat_tasks",
'exchange_type':"direct",
'binding_key':"beat_tasks"
},
'work_tasks':{
'exchange':"work_tasks",
'exchange_type':"direct",
'binding_key':"work_tasks"
}
}
<!--默认使用的队列-->
CELERY_DEFAULT_QUEUE = 'work_tasks'
<!--任务列表-->
CELERY_IMPORTS = (
'course.tasks'
)
# 有些情况可以防止死锁
CELERYD_FORCE_EXECV = True
# 设置并发worker数量
CELERYD_CONCURRENCY = 4
# 允许重试
CELERY_ACKS_LATE = True
# 每隔work最多执行100个任务被销毁
CELERYD_MAX_TASKS_PER_CHILD = 100
CELERY_TASK_TIME_LIMIT = 12 * 30
CELERYBEAT_SCHEDULE = {
'task1':{
'task':"course-task",
'schedule':timedelta(seconds=5),
'options':{
'queue':"beat_tasks"
}
}
}
settings.py
并在settings.py中导入
from .celeryconfig import *
添加djcelery和创建的app
创建app下tasks.py文件
import time
from celery.task import Task
class CourseTask(Task):
<!--定时任务可以直接使用名称调用-->
name = 'course-task'
def run(self,*args,**kwargs):
print('start task')
time.sleep(4)
print("args={},kwargs{}".format(args,kwargs))
print('end task')
views.py调用任务
from django.http import JsonResponse
from django.shortcuts import render
# Create your views here.
from course.tasks import CourseTask
def do(request):
print('start request')
CourseTask.delay()
return JsonResponse({
'reuqest':"ok"
})
启动
python manage.py celery worker -l info
安装flower
pip install flower
python manage.py celery flower
可能遇到的错误:
Unrecoverable error: AttributeError("‘str’ object has no attribute ‘items’",)
解决方法:使用2.10版本即 pip install redis==2.10即可
不能root用户启动
临时解决export C_FORCE_ROOT=‘true’
File “/root/.pyenv3/lib/python3.6/site-packages/djcelery/management/commands/celery.py”, line 23, in Command
preload_options)
将celery.py中的options注释掉