什么是任务队列?
任务队列用作跨线程或机器分配工作的机制。
任务队列的输入是一个工作单元,称为任务,专用工作进程然后不断监视队列以执行新工作。
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