django使用celery

安装包

pip install celery==5.1.2

使用

官方文档:https://docs.celeryq.dev/en/stable/django/first-steps-with-django.html

1.创建django项目,在项目与settings.py同级的的目录下创建celery.py文件,添加以下内容

django使用celery_第1张图片

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文件中添加以下内容

django使用celery_第2张图片

from .celery import celery_app

__all__ = ['celery_app']

3.在项目的settings.py中添加celery相关的配置(定时任务不需要可以不配置,视情况而定)

django使用celery_第3张图片

"""
# 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 (必须是这个名字,不允许修改)

django使用celery_第4张图片

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

django使用celery_第5张图片

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'调用函数结果')

django使用celery_第6张图片


至此,异步任务已经完成了

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中的任务
  分别在两个终端中启动,便于观察。

django使用celery_第7张图片

django使用celery_第8张图片

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

时区设置django使用celery_第9张图片

b.登录admin进行管理

django使用celery_第10张图片

django使用celery_第11张图片

django使用celery_第12张图片

django使用celery_第13张图片

django使用celery_第14张图片

完成啦

参考文档:https://blog.csdn.net/qq_53582111/article/details/120207740
参考文档:https://www.cnblogs.com/huang-yc/p/10110754.html

你可能感兴趣的:(django,python,后端,开发语言)