Celery 是一个简单、灵活且可靠的分布式任务队列框架,用于处理大量的异步任务、定时任务等。它允许你将任务发送到消息队列,然后由后台的工作进程(worker)来执行这些任务,并且支持多种消息中间件,如 RabbitMQ、Redis 等。
Celery简介
Celery是一个简单、灵活、可靠的分布式系统,可以处理大量的消息,同时为操作提供维护这样一个系统所需的工具。
Celery有很多应用场景,典型示例如下:
- 发送电子邮件:可以将发送电子邮件的任务交给Celery,并向用户显示一个感谢页面,而不是让用户在填写完注册表格后等待。你可能会说,执行电子邮件发送代码不需要花费时间,但是如果电子邮件服务器没有响应,如果将这部分设置为同步,站点访问者将不得不等待,直到超时发生。
- 图片/其他文件上传任务:现在通过网页上传图片或其他类型的文档是非常常见的。假设希望提供一个工具来上传包含产品图像的产品信息,同时还需要根据要求调整图像大小,并增加与品牌相关的水印,用户在所有这些操作期间等待看起来不太好。他想要的只是看到他的过程已经完成的文本,然后继续前进。你可以创建多个celery任务来实现目标。
- 计划任务:celery也可以作为一个调度程序,执行周期性任务。
Celery主要概念
Celery基本架构如下图所示:
生产者:这个应用程序负责推送消息与所有需要的信息。
Broker: 这个模块实际上是作为消息队列服务的,像Redis或RabbitMQ这样的应用程序可以在这里使用。
任务:任务是序列化后在代理中排队的Python函数或任务。然后,任务函数由负责反序列化并执行它的工作程序挑选。默认的序列化格式是JSON,您可以将其更改为msgpack, YAML或pickle。
后端:该组件负责存储函数产生的结果.
环境准备
- 安装redis
这里为了快速演示,直接适用docker容器:
docker run -d -p 6379:6379 redis
- 安装依赖
首先安装 Celery 和 Redis(python连接redis):
pip install celery redis
基本示例
- 创建任务
创建项目(如使用poetry工具),以下是简单Celery任务模块示例:
# tasks.py 文件
from celery import Celery
# 创建Celery实例,指定名称和消息中间件(这里是Redis)的URL
app = Celery('tasks', broker=