📺

Celery

Created
Sep 6, 2023 07:09 AM
Tags
高性能框架

Celery 简介

Celery是一个功能完备即插即用的任务队列。它使得我们不需要考虑复杂的问题,使用非常简单。celery看起来似乎很庞大,先对其进行简单的了解,然后再去学习其他一些高级特性。 celery适用异步处理问题,当发送邮件、或者文件上传, 图像处理等等一些比较耗时的操作,我们可将其异步执行,这样用户不需要等待很久,提高用户体验。
celery的特点是:
  • 简单,易于使用和维护,有丰富的文档。
  • 高效,单个celery进程每分钟可以处理数百万个任务。
  • 灵活,celery中几乎每个部分都可以自定义扩展。
任务队列是一种跨线程、跨机器工作的一种机制.
任务队列中包含称作任务的工作单元。有专门的工作进程持续不断的监视任务队列,并从中获得新的任务并处理. celery通过消息进行通信,通常使用一个叫Broker(中间人)来协client(任务的发出者)和worker(任务的处理者). clients发出消息到队列中,broker将队列中的信息派发给worker来处理。 一个celery系统可以包含很多的worker和broker,可增强横向扩展性和高可用性能。

celery 架构

celery架构分成三部分
  • 消息中间件(broker) Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。包括, Redis等等
  • 任务执行单元(workers) Worker是Celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中(本质,一个work就是一个进程)。
  • 任务结果存储(backend) Task result store用来存储Worker执行的任务的结果,Celery支持以不同方式存储任务的结果,包括 redis等
    • notion image
      notion image

安装celery

pip install -U celery
也可以通过github上安装

使用

使用celery第一件事要做的最为重要的是就是要先创建一个Celery实例,我们一般叫做celery应用。或者更简单直接叫做app,app应用是我们使用celery功能的入口,比如创建任务,管理任务, 在使用celery的时候, app必须能够被其他模块接入
一般celery的根目录如下
Celery_tasks/ ├── config.py # 配置项 ├── __init__.py ├── main.py # 主程序 └── sms # 一个目录下可以放置多个任务,该目录下存放当前任务需要的模块和依赖 ├── __init__.py └── tasks.py # 任务的文件 文件名必须是这个 1 directory, 5 files
首先 main.py
from celery import Celery # 创建celery对象 app = Celery() # 加载配置 app.config_from_object("Celery_tasks.config") # 注册任务 app.autodiscover_tasks(['Celery_tasks.sms']) # app.autodiscover_tasks(['Celery_tasks.sms','Celery_tasks_mail']) # 通过终端 启动celery # celery -A Celery_tasks.main worker --loglevel=info
# 设置任务队列的地址 broker_url = 'redis://127.0.0.1:6379/14' # 消息中间件 # 设置消息队列的地质 result_backend = 'redis://127.0.0.1:6379/15' # 结果存储
sms/tasks.py
from Celery_tasks.main import app @app.task(name="send_sms") def send_message(): """发送短信""" return "hello,world"
启动celery
celery -A Celery_tasks.main worker --loglevel=info
启动成功
notion image
上述的 [tasks] . send_sms 是指 sms文件下的tasks 指定的 @app.task(name="send_sms")

多个tasks

可以在 send_mail中再加个task,只需要加入如下代码
mail/tasks.py
from Celery_tasks.main import app @app.task(name="send_main") def send_mail(): """发送邮件""" return "hello,mail!!!!"
同时main.py中也要完成对tasks的注册
app.autodiscover_tasks(['Celery_tasks.sms','Celery_tasks_mail'])

调用celery

from Celery_tasks.sms.tasks import send_sms send_sms.delay()
调用成功
notion image
redis数据库中
notion image
如果当你关闭celery 当你重新开启celery时 任务将不断轮询 从而执行一系列操作
Django Celery流程图
notion image
notion image
notion image