3

我有一个使用 rabbitmq 和 celery 的设置,工作人员在 4 台机器上运行,每台机器有 4 个实例。我定义了两个任务函数,它们基本上调用相同的后端函数,但其​​中一个process_transaction未定义 rate_limit 命名,另一个slow_process_transaction名为rate_limit="6/m". 任务进入 rabbitmq 上的不同队列,slow并且normal.

奇怪的是对这两个任务都执行了 rate_limit。如果我尝试使用 更改 rate_limit celery.control.rate_limit,则使用process_transaction不会更改有效汇率,并且使用slow_process_transaction名称会更改两者的有效汇率。

关于什么是错的任何想法?

4

1 回答 1

8

通过阅读存储桶源代码,我发现 celery 通过在完成任务后休眠时间增量来实现速率限制,因此,如果您在同一个工作人员中混合具有不同速率限制的任务,它们会相互影响。

分离工人解决了我的问题,但这不是最佳解决方案。

您可以通过在 celeryd 调用中使用节点名称和命名参数来分隔工作人员。例如,您有节点“快”和“慢”,并且您希望它们分别使用并发 5 和 1 的单独队列:

celeryd <other opts> -Q:fast fast_queue -c:fast 5 -Q:slow slow_queue -c:slow 1
于 2012-12-26T15:41:09.193 回答