Celery是如何工作的?

16

我最近开始研究分布式计算以提高计算速度,选择了Celery。然而,我对一些术语并不是很熟悉,因此有几个相关的问题。

根据Celery文档:

什么是任务队列?

...

Celery 通过消息进行通信,通常使用代理在客户端和工作者之间进行中介。要启动一个任务,客户端将消息添加到队列中,代理然后将该消息传递给工作者。

这里的客户端是什么?代理是什么?为什么要通过代理传递消息?为什么Celery会使用后端和队列进行进程间通信?

当我执行命令启动Celery控制台时:

celery worker -A tasks --loglevel=info --concurrency 5

这是否意味着Celery控制台是一个工作进程,负责5个不同的进程并跟踪任务队列?当新任务被推送到任务队列时,这个工作者会将任务/作业分配给其中任何一个进程吗?

2个回答

11

首先回答最后一个问题:

celery worker -A tasks --loglevel=info --concurrency 5

你是正确的 - 工作者控制5个进程。工作者在5个进程之间分配任务。

"客户端"是任何异步运行celery任务的代码。

有两种不同类型的通信 - 当你运行apply_async时,你向代理(最常见的是rabbitmq)发送任务请求 - 这基本上是一组消息队列。

当工作者完成任务后,它们将结果放入结果后端。

代理和结果后端非常独立,并需要不同类型的软件才能正常工作。

你可以使用RabbitMQ来处理这两个,但是一旦你达到一定的消息速率,它就无法正常工作。最常见的组合是使用RabbitMQ作为代理,并使用Redis作为结果后端。


感谢提供的简要信息。您是说RabbitMQ作为代理,Redis作为后端,对吗? 1)那么这个memcached在哪里发挥作用呢?我看到很多论坛将其用作消息队列。 2)如果我在两个不同的控制台中执行了上述celery worker命令,并从交互式Python提交了一个任务,那该怎么指定使用特定的工作进程控制台呢? - jeldikk
memcached可以用来替代Redis,但是Redis可能是更好的选择。你的第二个问题没有意义,请再次阅读celery文档,然后在SO上提出一个新问题。 - scytale

0
我们可以借助工厂中的装配线包装类比来理解 Celery 的工作原理。

enter image description here

每个产品都放在传送带上。 产品由机器加工处理。 最终,所有经过处理的产品都按顺序存储在一个位置。
Celery工作原理:
注意:与将每个产品在传送带上处理不同,在Celery中,维护队列,其输出将被馈送给一个工作进程以执行一个任务(有时维护多个队列)。
每个请求(即任务)都发送到队列(Redis / Rabbit MQ),并返回确认。 每个任务分配给特定的工人来执行任务。 一旦工人完成任务,它的输出就存储在结果后端(Redis)中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接