python 分布式任务队列 Celery 入门指南

1,082 阅读2分钟

一、简介

Celery 是一款非常简单、灵活、可靠的分布式任务队列系统,可用于处理大量消息,实时数据以及任务调度,并且提供了一系列工具。

Celery 通过消息机制进行通信,通常使用中间人(Broker)作为客户端和职程(Worker)调节。启动一个任务,客户端向消息队列发送一条消息,然后中间人(Broker)将消息传递给一个职程(Worker),最后由职程(Worker)进行执行中间人(Broker)分配的任务。

架构图如下:

Celery 可以有多个职程(Worker)和中间人(Broker),用来提高Celery的高可用性以及横向扩展能力。

Celery 是用 Python 编写的,但协议可以用任何语言实现。除了 Python 语言实现之外,还有Node.js的 node-celery 和 php 的 celery-php

它具有如下这些优点:

  1. 简单,不需要配置文件就可以直接运行
  2. 高可用,如果出现丢失连接或连接失败,职程(Worker)和客户端会自动重试,并且中间人通过 主/主 主/从 的方式来进行提高可用性。
  3. 快速,单个 Celery 进行每分钟可以处理数以百万的任务,而且延迟仅为亚毫秒
  4. 灵活,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