django 使用 celery

1,046 阅读2分钟

celery 是一款分布式任务调度组件,在 Django 开发中,使用它来完成异步任务的分发和定时任务的调度。

下面是一张介绍 celery 架构的图

image.png 消息代理和存储结果我们都选用的是 redis。

异步任务调度

介绍

在实际使用中,我们会有这样的需求:在一个接口中,主要的功能已经处理完成,可以返回接口以及成功,但是后续还有一些非必要的功能(比如在一个数据上传接口中,当数据成功存储后,可以返回处理成功了,但是我们还需要根据上传的数据做一些处理,例如记录上传信息,给关注此类数据的用户发送通知等)这些任务不应该在接口逻辑中完成,会造成接口调用的时间延迟,给用户带来不好的体验,此时我们就可以开启其他的进程,用来将这些非必要的任务完成,celery就派上了用场。

代码实现

我们的主目录名为 main_server

main_server/setting.py

# 定义消息代理和存储结果的 redis url
CELERY_BROKER_URL = 'redis://:password@host:6379'
CELERY_RESULT_BACKEND = 'redis://:password@host:6379'
# 设置默认不存结果
CELERY_TASK_IGNORE_RESULT = True
# 序列化方案
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'

main_server/celery.py

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from django.utils import timezone

# 设置 django 环境
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'main_server.settings')
app = Celery('dec_server')
# 设置 celery 配置
app.config_from_object('django.conf:settings', namespace='CELERY')
app.now = timezone.now
# 导入注册app模块
app.autodiscover_tasks()

具体任务 app/tasks.py

如果 app 下有异步任务的话,建立 tasks.py 文件

# 导入在最上方定义的 celery 对象
from main_server.celery import app as celery_app
# 注册具体任务
@celery_app.task
def testTask():
    pass

在视图中调用

# 导入生成的任务
from app.tasks import testTask
testTask.delay()

定时任务

需要安装django-celery-beat插件 pip3 install django-celery-beat

app 注册

新建任务

如果要新建一个任务的话

from django_celery_beat.models import PeriodicTask, IntervalSchedule

schedule, created = IntervalSchedule.objects.get_or_create(
        every=10, period=IntervalSchedule.SECONDS
    )
PeriodicTask.objects.get_or_create(
        interval=schedule,
        name=task_name,
        defaults={
            "description": description,
            "kwargs": kwargs,
            "task": task 的定义位置
            "queue": ""
        },
    )

启动

celery -A main_server beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler 启动beta 调度器使用数据库