目录
一、什么是celery
1、celery简介
Celery是一个基于Python开发的分布式异步消息任务队列,它专注于实时处理的异步任务队列,同时也支持任务调度。Celery的设计哲学是简单、灵活且可靠,能够处理大量消息,适用于多种场景下的任务调度和执行。celery官网是:Celery - Distributed Task Queue --- Celery 5.4.0 documentation (celeryq.dev)
2、celery的使用场景
异步任务:将耗时操作任务提交给Celery去异步执行,比如发送短信/邮件、消息推送、音视频处理等等。
定时任务:利用Celery的定时任务功能,可以定时执行某些任务,如每天的数据统计、定时清理缓存等。
分布式任务调度:在分布式系统中,Celery可以作为任务调度的中心,协调各个节点上的任务执行。在分布式系统中,Celery可以作为任务调度的中心,协调各个节点上的任务执行。
3、celery的架构
消息中间件(Broker):作为任务的中间人(Broker),负责接收和分发任务消息。Celery本身不提供消息中间件,但可以与第三方提供的消息中间件集成,如RabbitMQ、Redis等。
任务执行单元(Worker):是Celery处理任务的执行单元,Worker并发的运行在分布式的系统节点中,持续不断地监视任务队列,并从中获取新的任务进行处理。
任务执行结果存储(backend):用于存储Worker执行的任务结果,Celery支持以不同方式存储任务的结果,如Mysql、Redis等。
二、Django使用celery
1、安装celery
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple celery
如果是window系统还需要安装一个eventlet库
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple eventlet
2、Django配置
在settings文件下配celery
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/2' # broker的配置
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/3' # backend的配置
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Asia/Shanghai' # 时区配置
CELERY_TASK_RESULT_EXPIRES = 60*60*24 # 任务过期时间
新建celery.py文件,必须与settings.py同级目录,再在celery.py里面写入下面代码,其中第3行代码的setting
import os
from celery import Celery
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "house.settings")#将house换成你自己的项目名字
app = Celery('proj')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
在同级的__init__.py文件里写入下面代码
from .celery import app as celery_app
__all__ = ('celery_app',)
然后在app目录下新建task.py文件,这个文件是我们要执行的异步任务,定时任务这些,只能用task命名,为了区别是clery执行的任务所以我们还需给这个函数加上装饰器@shared_task,当然这里面的函数是我们自己定义的,可以是发送邮件等其它逻辑,但是必须要加上装饰器。
from celery import shared_task
@shared_task
def add(x,y):
return x+y
提交任务到消息中间件,所以我们需要用到Django视图函数来执行这个函数delay是执行异步任务的,add的参数也需要写到delay里面,执行这个视图函数并不是运行了,只是提交了运行这个函数的任务
class AddView(APIView):
def get(self, request):
sum_ = add.delay(1, 2) # add是函数的名字,delay是提交异步任务到队列中,但是还没有执行
print(sum_)
print(sum_.get())
return Response(data='ok')
要执行这个任务需要celery的worker,所以我们要在终端输入以下命令来启动worker
celery -A house worker -l info -P eventlet #要将house换成django项目的名字
切换到django终端看视图的执行结果,这样就运行成功了成功了,在切换django的终端查看运行结果
三、定时任务和异步任务
sum_ = add.delay(1, 2) #delay提交异步任务
sum_ = add.apply_async(args=[1,2],eta='什么时候执行') #apply_async表示定时任务