【问题标题】:Celery Accepting more tasks than worker concurrency芹菜接受比工人并发更多的任务
【发布时间】:2019-09-18 19:44:10
【问题描述】:

我正在专用队列中运行一些长时间运行的任务。所以没有短时间运行的任务。目前,当我在一个队列上启动许多多个任务时,新任务正在提交给已经满的工作人员,即没有任务=工作人员并发。监听同一个队列的worker 2 仍然有更少的任务,可以接受更多的任务。理想情况下,任务应该交给工人 2。

这种行为的原因是什么?是因为预取吗?

我们进一步看到,提交给工人 1 的任务已经满了,在某个时间后,即大约 2 小时后转到工人 2。为什么会这样?为什么在 2 小时后?有没有办法减少任务从工人 1 到工人 2 的时间。

我的延迟确认已设置 = true 工人的可见性超时= 6小时。 经纪人是redis。 芹菜版 4.2.1

我附上了一些截图来捕捉这种行为: 我的另一个工人仍然是空的,但它去了已经满的工人

我只能在这个链接中接近这个http://docs.celeryproject.org/en/latest/userguide/optimizing.html#reserve-one-task-at-a-time

请以 trailblazer.streaming.growth_fortune trailblazer-growth-fortune-stream-0001 2019-04-25T10:10:00 为例。 该任务在 10:18 排队到 worker 1,然后在 2 小时后,它在 12:20 开始在 worker 2 上运行。 截图一:芹菜花 截图二:Airflow Ui

【问题讨论】:

    标签: celery airflow celery-task airflow-scheduler


    【解决方案1】:

    默认情况下 celery 将prefetch 4 tasks at a time。在短期运行的任务中,这种行为更有效,因为工作人员不必不断地返回队列来获取更多任务,因为它已经保留了一些任务来处理。对于像您这样长时间运行的任务,您可能希望通过使用 -O fair 选项来“禁用”预取,如文档中的 here

    【讨论】: