什么是任务队列?

任务队列用作跨线程或机器分配工作的机制。

任务队列的输入是一个工作单元,称为任务,专用工作进程然后不断监视队列以执行新工作。

Celery 通过消息进行通信,通常使用代理在客户端和工人之间进行调解。

为了启动任务,客户端将消息放入队列,然后代理将消息传递给工作人员。

Celery 系统可以由多个 worker 和 broker 组成,让位于高可用性和水平扩展。

Celery 是用 Python 编写的,但该协议可以用任何语言实现。

除了 Python 之外,还有用于 Node.js 的 node-celery、一个 PHP 客户端、用于 golang 的 gocelery 和用于 Rust 的 rusty-celery。

语言互操作性也可以通过使用 webhooks 的方式来实现,即客户端将 URL 排入队列以供工作人员请求。

我需要什么?

Celery 版本 5.2.0b3 运行,

  • Python(3.7、3.8、3.9)

  • PyPy3.7 (7.3+)

这是 celery 的下一个版本,它将支持 Python 3.6 或更高版本。

如果您运行的是旧版本的 Python,则需要运行旧版本的 Celery:

  • Python 2.6:Celery 系列 3.1 或更早版本。

  • Python 2.5:Celery 系列 3.0 或更早版本。

  • Python 2.4:Celery 系列 2.2 或更早版本。

  • Python 2.7:芹菜 4.x 系列。

  • Python 3.6:芹菜 5.1 或更早版本。

Celery 是一个资金最少的项目,所以我们不支持 Microsoft Windows。 请不要打开与该平台相关的任何问题。

Celery 通常与消息代理一起使用来发送和接收消息。

RabbitMQ 和 Redis 传输功能齐全,但也有对无数其他解决方案的实验性支持,包括使用 SQLite 进行本地开发。

Celery 可以在一台机器上运行,也可以在多台机器上运行,甚至可以跨数据中心运行。

开始

如果这是您第一次尝试使用 Celery,或者您是来自以前版本的 Celery 5.0.5 或 5.2.0b3 的新手,那么您应该阅读我们的入门教程:

入门例子

选择 Broker

Celery 需要一个解决方案来发送和接收消息; 通常这以称为消息代理的单独服务的形式出现。

有多种选择,包括:

RabbitMQ

RabbitMQ 功能齐全、稳定、耐用且易于安装。 它是生产环境的绝佳选择。

有关在 Celery 中使用 RabbitMQ 的详细信息:

如果您使用的是 Ubuntu 或 Debian,请执行以下命令安装 RabbitMQ:

$ sudo apt-get install rabbitmq-server

或者,如果您想在 Docker 上运行它,请执行以下操作:

$ docker run -d -p 5672:5672 rabbitmq

当命令完成时,代理将已经在后台运行,准备为您移动消息:启动 rabbitmq-server: SUCCESS。

如果您运行的不是 Ubuntu 或 Debian,请不要担心,您可以访问此网站以查找其他平台(包括 Microsoft Windows)的类似简单安装说明:

http://www.rabbitmq.com/download.html

Redis

Redis 的功能也很完整,但在突然终止或断电的情况下更容易丢失数据。

如果要在 Docker 上运行它,请执行以下操作:

$ docker run -d -p 6379:6379 redis

安装 Celery

Celery 位于 Python Package Index (PyPI) 上,因此可以使用标准 Python 工具(如 pip 或 easy_install)安装它:

$ pip install celery

应用

你需要的第一件事是一个 Celery 实例。 我们称之为 Celery 应用程序或简称为应用程序。

因为这个实例被用作你想在 Celery 中做的所有事情的入口点,比如创建任务和管理工作人员,其他模块必须可以导入它。

在本教程中,我们将所有内容都包含在单个模块中,但对于较大的项目,您希望创建一个专用模块。

让我们创建文件 tasks.py:

from celery import Celery

app = Celery('tasks', broker='pyamqp://guest@localhost//')

@app.task
def add(x, y):
    return x + y

Celery 的第一个参数是当前模块的名称。

这只是为了在 __main__ 模块中定义任务时可以自动生成名称。

第二个参数是代理关键字参数,指定要使用的消息代理的 URL。

这里我们使用 RabbitMQ(也是默认选项)。

有关更多选择,请参阅上面的选择代理 - 对于 RabbitMQ,您可以使用 amqp://localhost,或者对于 Redis,您可以使用 redis://localhost。

您定义了一个名为 add 的任务,它返回两个数字的总和。

拓展阅读

参考文档

https://github.com/celery/celery