是否可以在 Celery 中为每个队列分别设置 "worker_prefetch_multiplier"?

Is it possible to set "worker_prefetch_multiplier" for each queue separately in Celery?

我想知道是否可以为队列设置不同的预取乘数。

我有 2 个队列,一个有非常短的 运行 任务,另一个稍长。较短任务的队列需要优先于其他任务。

为了确保优先级工作可靠,必须在 celery 配置中设置:

task_acks_late = True
worker_prefetch_multiplier = 1

但是,这确实会损害快速任务队列的性能。是否可以配置,如果工作人员从快速任务队列中获取,worker_prefetch_multiplier 是 4,如果工作人员从慢速任务队列中获取,worker_prefetch_multiplier 是 1?

我不确定是否可以为每个队列定义不同的预取限制,因为 the Celery documentation seems to set these limits per worker

但是,我们正在通过为每个队列启动不同的工作程序来解决这个问题。您可以为每个工作人员定义不同的预取限制 - 如果一个工作人员仅使用一个队列,您还可以定义不同的预取限制以及每个队列的工作人员并发数。这还有一个额外的好处,即您的 long-运行 任务不会阻塞 worker 处理 short-运行 任务的时间。 如果您碰巧考虑使用 celery-batches 来进一步加快短 运行 任务的处理速度,那么将队列分离到不同的 worker 就变得更加重要,因为您希望获得相当高的预取为该工作人员定义的限制(注意:如果您的预取限制为 0 并且队列非常满,您最终将 运行 内存不足)。

在我们的案例中,我们是 运行 容器化环境中的工人。这使我们甚至可以为每个工作人员/队列定义独立的资源分配(内存/cpu)。