一.相关参考
1.代码参考:https://www.imooc.com/video/17955
2.异常信息参考:https://blog.csdn.net/cn_1937/article/details/91992075
3.补充参考:https://blog.csdn.net/sanyuedexuanlv/article/details/88052884
二.使用步骤
1.安装
pip install django-celery
2.项目主目录中新增celery配置文件 celeryconfig.py
from datetime import timedelta
import djcelery
djcelery.setup_loader()
BROKER_BACKEND = "redis"
BROKER_URL = 'redis://127.0.0.1:6379/1'
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/2'
# 设置任务队列,区分不同的任务类型
CELERY_QUEUES = {
"beat_tasks": {
"exchange": "beat_tasks",
"exchange_type": "direct",
"binding_key": "beat_tasks",
},
"work_queue": {
"exchange": "work_queue",
"exchange_type": "direct",
"binding_key": "work_queue",
},
}
# 指定默认使用的任务队列
CELERY_DEFAULT_QUEUE = "work_queue"
# # 注册任务:对应celerytask应用下的tasks文件中的类
CELERY_IMPORTS = (
"celerytask.tasks",
)
# 有些情况下可以防止死锁
CELERYD_FORCE_EXECV = True
# 设置并发的worker数量
CELERYD_CONCURRENCY = 4
# 任务失败时允许重试
CELERY_ACKS_LATE = True
# 设置每个worker最多执行100个任务,之后会被销毁,可以防止内存泄漏
CELERYD_MAX_TASKS_PER_CHILD = 100
# 单个任务的最大运行时间,超时时会被终止
CELERYD_TASK_TIME_LIMIT = 12 * 30
# 设置定时任务
CELERYBEAT_SCHEDULE = {
'task1': {
'task': 'beat-task',
'schedule': timedelta(seconds=5),
# 'args': (2, 6),
'options': { # 设置使用的任务队列
'queue': 'beat_tasks',
}
}
}
3.新建celerytask应用执行celery任务
任务文件 tasks.py,worker会执行类中的run方法
from celery.task import Task
import time
class TestTask(Task):
# 任务名, 定时任务会用到
name = "test-task"
def run(self, *args, **kwargs):
print("任务开始...")
print("args=%s, kwargs=%s" % (args, kwargs))
time.sleep(4)
print("任务结束...")
# 定时任务
class BeatTask(Task):
# 任务名
name = "beat-task"
def run(self, *args, **kwargs):
print("任务开始...")
print("当前时间:", time.time())
print("任务结束...")
4. views.py
from django.http import JsonResponse
from celerytask.tasks import TestTask # 导入需要执行的任务
def do(request):
print("接受到请求...")
# 执行异步任务
# TestTask.delay()
# 第二种启动方式,可以传参和指定队列
TestTask.apply_async(args=("这是args",), queue='work_queue')
print("结束请求...")
return JsonResponse({"result": "ok"})
5. settings.py
INSTALLED_APPS += [
'celerytask',
'djcelery',
]
# 导入celery相关的配置
from .celeryconfig import *
6.启动worker
python manage.py celery worker -l INFO -Ofair
7.启动定时任务
python manage.py celery beat -l INFO
8.启动时发生的异常
- TypeError:can only concatenate list (not ‘tuple’) to list
将 djcelery\management\commands\celery.py 中的 options 部分注释掉 - AttributeError: ‘str’ object has no attribute ‘items’
redis版本问题:pip install redis==2.10.6