一、简介
Celery 是一款非常简单、灵活、可靠的分布式任务队列系统,可用于处理大量消息,实时数据以及任务调度,并且提供了一系列工具。
Celery 通过消息机制进行通信,通常使用中间人(Broker)作为客户端和职程(Worker)调节。启动一个任务,客户端向消息队列发送一条消息,然后中间人(Broker)将消息传递给一个职程(Worker),最后由职程(Worker)进行执行中间人(Broker)分配的任务。
架构图如下:
Celery 可以有多个职程(Worker)和中间人(Broker),用来提高Celery的高可用性以及横向扩展能力。
Celery 是用 Python 编写的,但协议可以用任何语言实现。除了 Python 语言实现之外,还有Node.js的 node-celery 和 php 的 celery-php。
它具有如下这些优点:
- 简单,不需要配置文件就可以直接运行
- 高可用,如果出现丢失连接或连接失败,职程(Worker)和客户端会自动重试,并且中间人通过 主/主 主/从 的方式来进行提高可用性。
- 快速,单个 Celery 进行每分钟可以处理数以百万的任务,而且延迟仅为亚毫秒
- 灵活,Celery 的每个部分几乎都可以自定义扩展和单独使用,例如自定义连接池、序列化方式、压缩方式、日志记录方式、任务调度、生产者、消费者、中间人(Broker)等
二、安装
使用 pip 进行安装:
pip install -U Celery
Celery 自定义了一组用于安装 Celery 和特定功能的依赖。
您可以在中括号加入您需要依赖,并可以通过逗号分割需要安装的多个依赖包。
pip install "celery[librabbitmq,redis,auth,msgpack]"
具体有哪些依赖包,可以自行去官网查看。
三、简单使用
创建第一个 Celery 实例程序,我们把创建 Celery 程序成为 Celery 应用或直接简称 为 app,创建的第一个实例程序可能需要包含 Celery 中执行操作的所有入口点,例如创建任务、管理职程(Worker)等,所以必须要导入 Celery 模块。
首先创建 tasks.py:
from celery import Celery
app = Celery('tasks', broker='amqp://guest@localhost//')
@app.task
def add(x, y):
return x + y
Celery()第一个参数为当前模块的名称,第二个参数为中间人(Broker)的链接 URL ,实例中使用的 RabbitMQ(Celery默认使用的也是RabbitMQ)。
现在可以使用 worker 参数进行执行我们刚刚创建职程(Worker):
$ celery -A tasks worker --loglevel=info
需要调用我们创建的实例任务,可以通过 delay()
进行调用。
delay()
是 apply_async()
的快捷方法,可以更好的控制任务的执行:
>>> from tasks import add
>>> add.delay(4, 4)
该任务已经有职程(Worker)开始处理,可以通过控制台输出的日志进行查看执行情况。
如果您需要跟踪任务的状态,Celery 需要在某处存储任务的状态信息,例如使用Redis作为Celery结果后端。
app = Celery('tasks', backend='redis://localhost', broker='pyamqp://')
四、配置
大多数情况下,使用默认的配置就可以满足,也可以按需配置。针对大型的项目,建议使用专用配置模块,进行针对 Celery 配置,一般在同级目录下创建一个名为 celeryconfig.py
的文件,通过 app.config_from_object()
进行加载配置模块:
app.config_from_object('celeryconfig')
配置示例:
broker_url = 'pyamqp://'
result_backend = 'rpc://'
task_serializer = 'json'
result_serializer = 'json'
accept_content = ['json']
timezone = 'Europe/Oslo'
enable_utc = True
可以通过以下命令来进行验证配置模块是否配置正确:
$ python -m celeryconfig