celery 是一款分布式任务调度组件,在 Django 开发中,使用它来完成异步任务的分发和定时任务的调度。
下面是一张介绍 celery 架构的图
消息代理和存储结果我们都选用的是 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 调度器使用数据库