芹菜是如何工作的?

Posted

技术标签:

【中文标题】芹菜是如何工作的?【英文标题】:How does Celery work? 【发布时间】:2016-04-14 21:07:33 【问题描述】:

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

来自Celery docs:

什么是任务队列?

...

Celery 通过消息进行通信,通常使用代理在客户端和工作人员之间进行调解。为了启动任务,客户端将消息添加到队列中,然后代理将该消息传递给工作人员。

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

当我通过发出命令执行 Celery 控制台时

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

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

【问题讨论】:

【参考方案1】:

最后一个问题:

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

你是对的 - 工人控制 5 个进程。 Worker 在 5 个进程之间分配任务。

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

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

当工作人员完成后,他们将结果放入结果后端。

代理和结果后端是完全独立的,需要不同类型的软件才能以最佳方式运行。

两者都可以使用 RabbitMQ,但是一旦达到一定的消息速率,它将无法正常工作。最常见的组合是用于代理的 RabbitMQ 和用于结果的 Redis。

【讨论】:

感谢您提供简短信息。您说的是 RabbitMQ 作为代理,Redis 作为后端。 1.)这个memcached在哪里发挥作用。我见过很多论坛使用它作为消息队列。 2.)如果我在两个不同的控制台中执行了上述 celery worker 命令并从交互式 python 提交了一个任务..??我的意思是,我如何指定使用这个特定的工作控制台...?? memcached 可以用来代替 Redis。 Redis 可能是更好的选择。你的第二个问题没有意义。请再次阅读 celery 文档,然后在 SO 中提出一个新问题

以上是关于芹菜是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用芹菜任务结果记录?

如何使用芹菜工人将 django 项目部署到谷歌云?

如何在芹菜中将任务从一个队列移动到另一个队列

如何防止芹菜执行相同的任务?

在任务中获取芹菜节拍触发时间

如何关闭芹菜节点