芹菜一遍又一遍地重新运行长期完成的任务

时间:2014-12-05 07:27:16

标签: python celery celery-task

我有一个python celery-redis队列处理上传和下载一次有价值的演出和数据。

很少上传需要几个小时。然而,一旦这样的任务完成,我正在目睹这种奇怪的芹菜行为,芹菜调度员再次通过再次发送给工人重新运行刚刚结束的任务(我正在运行一个单独的工人)并且它刚刚发生了2次任务!

有人可以帮助我知道为什么会发生这种情况,我该如何预防呢?

任务肯定是干净利落地完成,没有错误报告只是这些是非常长时间运行的任务。

1 个答案:

答案 0 :(得分:5)

我最近遇到了这个问题,并最终发现任务是 由于组合而多次运行 task prefetching并且任务超出了 visibility timeout。任务在执行之前得到确认(除非您设置ACKS_LATE = True), 默认情况下,每个进程预取4个任务。第一项任务将是 在执行之前确认,但如果执行需要一个多小时,那么 其他预取的任务将被传递给另一个工作人员 再执行一次(或者在你的情况下, 由同一个工人执行额外的时间)。

您可以通过将可见性超时增加到比任务的最长运行时间更长的时间来解决:

BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 3600*10}  # 10 hours

您还可以将PREFETCH_MULTIPLIER=1设置为禁用预取,以便长时间运行的任务不会保留 其他任务得不到承认。