Celery工作人员在关闭时安排的任务会发生什么?

时间:2015-02-19 19:31:30

标签: python celery

我一直在学习芹菜和避风港能够找到一个概念性问题的答案,并且尝试了奇怪的结果。

当有计划任务(按计划,我不是指周期性但计划将来使用eta = x运行)提交给Celery时,它们似乎是立即被工作人员从队列中消耗掉(而不是留在Redis默认的芹菜键/队列)。据推测,工人实际上将执行eta的任务。

如果该工作人员被关闭或重新启动(例如更新它的注册任务)会怎样?那些预定的任务会丢失吗?他们不是"跑步"所以热情的终止当然不会等到他们完成。

有没有办法强制这些任务返回队列并被下一个可用的工作者使用?

我想,手动,可以在关闭工作人员之前转储任务:

http://celery.readthedocs.org/en/latest/userguide/workers.html#inspecting-workers

并在新工作人员重新启动时重新提交...但是这应该是自动发生的吗?

非常感谢您对此的任何帮助

由于

2 个答案:

答案 0 :(得分:2)

看看acks_late https://code.angularjs.org/1.4.1/docs/api/ng/type/ngModel.NgModelController

如果设置为true,Celery会将任务保留在队列中,直到成功执行为止。

答案 1 :(得分:0)

更新:Celery 5.1

即使启用了 acks_late,工作人员也会确认该消息。这是图书馆规定的默认和有意设置。 [Ref]

要更改默认设置并使未完成的任务重新排队,您可以使用 task_reject_on_worker_lost 配置。 [Ref]

但请记住,如果您的任务不是幂等,这可能会导致消息循环并导致意想不到的效果。

特别是对于 eta 任务,队列在删除任务之前等待工作人员确认任务。在默认设置下,celery 工作人员在任务执行前立即确认,并在任务执行完成时使用 acks_late

因此,当工作人员无法确认任务时,可能是由于关闭/重启/lost_connection 或在 Redis/SQS visibility_timeout 超过 [ref] 的情况下,队列会将消息重新传递给任何可用的工作人员.