芹菜多个工人,但一个队列

celery multiple workers but one queue

我是 celery 和 redis 的新手。

我使用 redis-server 启动了我的 redis 服务器。

Celery 运行 使用此参数

celery -A proj worker 

没有其他配置。但是,我意识到当我在 celery 中有一个很长的 运行ning 作业时,它不会处理队列中的另一个任务,直到 运行ning 任务完成。我的理解是,由于我的 CPU 上有 8 个核心,我应该能够同时处理 8 个任务,因为 -c 的默认参数是核心数?

我是不是遗漏了什么?

你的问题很经典,每个人都遇到过这个长期运行任务的人。

根本原因是芹菜试图优化您的执行流程,为每个工作人员保留一些任务。但是,如果其中一项任务是 long-运行,则其他任务将被锁定。它被称为 'prefetch count'。这是因为默认情况下 celery 设置为短任务。

另一个相关设置是 'late ack'。默认情况下,worker 从队列中取出一个任务并立即发送一个 'acknowledge' 信号,然后 broker 将这个任务从队列中移除。但这意味着将为该工作人员预取更多消息。 'late ack' enabled 告诉 worker 只有在任务完成后才发送确认。

这就两个字。你可以 read more about prefetch and late ack.

至于解决方案 - 只需使用这些设置(芹菜 4.x):

task_acks_late = True
worker_prefetch_multiplier = 1

或以前的版本(2.x - 3.x):

CELERY_ACKS_LATE = True
CELERYD_PREFETCH_MULTIPLIER = 1

此外,使用参数 -Ofair 启动 worker 也是一样的。