gpt4 book ai didi

redis - celery 多个 worker ,但一个队列

转载 作者:IT王子 更新时间:2023-10-29 05:59:02 25 4
gpt4 key购买 nike

我是 celery 和 redis 的新手。

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

Celery 是使用这个参数运行的

celery -A proj worker 

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

我是不是漏掉了什么?

最佳答案

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

根本原因是 celery 试图优化您的执行流程,为每个工作人员保留一些任务。但是,如果其中一项任务长期运行,则其他任务将被锁定。它被称为“预取计数”。这是因为默认情况下 celery 设置为短任务。

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

这只是两个词。你可以read more about prefetch and late ack .

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

task_acks_late = True
worker_prefetch_multiplier = 1

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

CELERY_ACKS_LATE = True
CELERYD_PREFETCH_MULTIPLIER = 1

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

关于redis - celery 多个 worker ,但一个队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42433770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com