【celery】任务重复执行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【celery】任务重复执行相关的知识,希望对你有一定的参考价值。

参考技术A celery定时任务里面启用延时任务,出现延时任务重复执行的问题。
如:
定时任务:

project_status_monitor任务执行时,再生成若干个延迟任务:

这时如果countdown配置的时间太长,该任务回重复执行多次。

原因是对于eta/countdown延迟任务,有超时时间,如果超过超时时间任务未被执行,会被丢到下一个worker去执行,造成循环执行。当我们设置一个ETA时间比visibility_timeout长的任务时,每过一次 visibility_timeout 时间,celery就会认为这个任务没被worker执行成功,重新分配给其它worker再执行

参考: https://docs.celeryproject.org/en/stable/userguide/workers.html

如何确保 Celery 任务是防止重叠的 Celery 任务执行

【中文标题】如何确保 Celery 任务是防止重叠的 Celery 任务执行【英文标题】:How to ensure a Celery task is Preventing overlapping Celery task executions 【发布时间】:2012-04-12 13:00:10 【问题描述】:

如何防止 Celery 在上一次执行完成之前执行周期性任务?

我有一个服务器集群,链接到一个公共数据库服务器,执行 Celery 任务,我发现每台服务器有时可能同时运行相同的任务,以及同时运行相同任务的不同服务器。这导致了许多竞争条件,它们以极其微妙的方式破坏了我的数据。

我一直在阅读Celery's docs,但我找不到任何明确允许这样做的选项。我找到了similar question,但建议的修复似乎是一个 hack,因为它依赖于 Django 的缓存框架,因此可能不会被集群中的所有服务器共享,允许多个服务器同时执行相同的任务.

Celery中是否有选项可以记录数据库中当前正在运行的任务,直到数据库记录被清除后才再次运行?

我正在使用 Django-Celery 模块,尽管它提供了 /admin/djcelery/taskstate/ 和 /admin/djcelery/workerstate/ 页面,但我从未见过任何长期 -正在运行的任务或工作人员出现在那里。

【问题讨论】:

【参考方案1】:

标准方式是通过django标准缓存机制使用共享锁。参见官方文档中的this recipe

【讨论】:

就像我提到的那样,这不是集群设置中的强大机制...为什么没有使用数据库的选项? 使用 memcached 后端,您将获得集群功能 @AlexLebedev,这是一个很好的观点,但当且仅当集群中的机器共享后端。例如,在本地运行 memcached 并在每个盒子上使用 localhost memcached 后端并不是不可想象的。逻辑上很明显,但我只是想指出一点,以免有人认为“哦,我正在使用 memcached,问题解决了。”【参考方案2】:

如果我是你,我会为任何不能同时执行的作业设置一个特殊队列。然后,您可以简单地为该队列启动一个单独的工作人员。

【讨论】:

以上是关于【celery】任务重复执行的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 celery 安排任务在特定时间执行?

Celery-定时任务

Celery Beat:一次限制为单个任务实例

如何实现按计划执行任务?

在 SQLAlchemy 中处理插入时重复的主键(声明式样式)

如何确保 Celery 任务是防止重叠的 Celery 任务执行