如何确保 Celery 任务是防止重叠的 Celery 任务执行
Posted
技术标签:
【中文标题】如何确保 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 任务执行的主要内容,如果未能解决你的问题,请参考以下文章