【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】任务重复执行的主要内容,如果未能解决你的问题,请参考以下文章