安装包
pip install celery==5.1.2
使用
官方文档:https://docs.celeryq.dev/en/stable/django/first-steps-with-django.html
1.创建django项目,在项目与settings.py同级的的目录下创建celery.py文件,添加以下内容
import os
import django
from celery import Celery
from django.conf import settings
# 设置系统环境变量,安装django,必须设置,否则在启动celery时会报错
# dj_celery 是当前项目名
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dj_celery.settings')
django.setup()
celery_app = Celery('dj_celery')
# 指定配置文件的位置
celery_app.config_from_object('django.conf:settings', namespace='CELERY')
# 自动从settings.INSTALLED_APPS注册的应用中加载tasks.py
celery_app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
2.在项目的__init__.py文件中添加以下内容
from .celery import celery_app
__all__ = ['celery_app']
3.在项目的settings.py中添加celery相关的配置(定时任务不需要可以不配置,视情况而定)
"""
# celery
# Broker配置,使用Redis作为消息中间件
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/0'
# BACKEND配置,这里使用redis
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'
# 结果序列化方案
CELERY_RESULT_SERIALIZER = 'json'
# 任务结果过期时间,秒
CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24
# 时区配置
CELERY_TIMEZONE = 'Asia/Shanghai'
# 指定导入的任务模块,可以指定多个
# CELERY_IMPORTS = (
# 'mycelery.tasks',
# )
# 添加定时任务
from celery.schedules import crontab
CELERY_BEAT_SCHEDULE = {
'add_every_1_minute': {
# 任务路径
'task': 'mycelery.tasks.add',
# 每1分钟执行一次
'schedule': crontab(minute='*/1'),
'args': (14, 5)
}
}
4.在app下创建各自的任务文件tasks.py (必须是这个名字,不允许修改)
import time
from celery import shared_task, Task
# 任务钩子
class MyHookTask(Task):
# 成功时执行
def on_success(self, retval, task_id, args, kwargs):
print(f'task id:{task_id} , arg:{args} , successful !')
# 失败时执行
def on_failure(self, exc, task_id, args, kwargs, einfo):
print(f'task id:{task_id} , arg:{args} , failed ! erros: {exc}')
# 任务重试时执行
def on_retry(self, exc, task_id, args, kwargs, einfo):
print(f'task id:{task_id} , arg:{args} , retry ! erros: {exc}')
# 在对应的task函数的装饰器中,通过 base=MyHookTask 指定任务钩子
@shared_task(base=MyHookTask)
def add(x, y):
time.sleep(10)
print(111111111111111111111111111111111111111111111)
return x + y
@shared_task
def mul(x, y):
return x * y
@shared_task(base=MyHookTask)
def xsum(numbers):
return sum(numbers)
5.至此,celery配置已经完成了,启动celery
在项目根目录下执行命令 启动celery worker 进程,执行broker中的任务:
-Linux:celery -A dj_celery worker -l info
-windows: celery -A dj_celery worker -l info -P eventlet (先要安装 pip install eventlet)
注:如果启动的时候有冲突,使用命令 celery -A dj_celery worker -l info -P eventlet --pool=solo
6.调用任务
from django.shortcuts import render
from django.http.response import HttpResponse
# Create your views here.
from .tasks import *
# Create your views here.
def task_add_view(request):
add.delay(100, 200)
return HttpResponse(f'调用函数结果')
至此,异步任务已经完成了
7.定时任务启动
因为我们在第3步配置celery的时候已经配置了定时任务,所以现在只需要启动celery beat进程就可以了,关于定时任务的配置可以看第3步
执行命令:
celery -A dj_celery beat -l info # 启动celery beat 进程,将定时任务发送到broker
celery -A dj_celery worker -l info # 启动celery worker 进程,执行broker中的任务
分别在两个终端中启动,便于观察。
8.admin后台配置定时任务
a.配置django-celery-beat
1.beat插件安装
pip3 install django-celery-beat
2.sttings设置
a.注册app
INSTALLED_APPS = [
....
'django_celery_beat',
]
b.时区设置
CELERY_TIMEZONE = 'Asia/Shanghai'
DJANGO_CELERY_BEAT_TZ_AWARE = False
CELERY_ENABLE_UTC = False
3.迁移模型
python3 manage.py migrate django_celery_beat
4.分别启动woker和beta
# 启动beta 调度器使用数据库
celery -A proj beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
# 启动woker
celery worker -A taskproj -l info
b.登录admin进行管理
完成啦
参考文档:https://blog.csdn.net/qq_53582111/article/details/120207740
参考文档:https://www.cnblogs.com/huang-yc/p/10110754.html