python - celery 一遍又一遍地重新运行长时间运行的已完成任务

标签 python celery celery-task

我有一个 python celery-redis 队列,一次处理上传和下载数以千计的数据。

很少有上传需要几个小时。然而,一旦这样的任务完成,我就目睹了这种奇怪的 celery 行为,即 celery 调度程序通过再次将其发送给 worker (我正在运行一个 worker )再次重新运行刚刚结束的任务并且它在同一个地方发生了 2 次任务!

谁能帮我知道为什么会这样,我该如何预防?

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

最佳答案

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

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

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

您还可以设置 PREFETCH_MULTIPLIER=1 来禁用预取,这样长时间运行的任务就不会保留 其他任务不被确认。

关于python - celery 一遍又一遍地重新运行长时间运行的已完成任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27310899/

相关文章:

python - Telebot + Celery + pytransitions : response to task

python - 或 Pandas 系列的关键字

python - 从父类控制子类方法

python - 与 AWS Lambda 重试失败函数相关的成本?

python - 让 Celery 使用 Django 异常中间件

python - 在 Django 应用程序的 Celery 任务中使用事务会导致问题吗?

python - Celery 调用不同的函数并继续链接过程

django - 如何在 django 上测试时禁用 celery 任务

Python celery socket.error : [Errno 61] Connection refused

python - 用句子增量训练 Sklearn 的 SGD 分类器