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

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

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

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

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

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

【问题讨论】:

    标签: python django celery django-celery


    【解决方案1】:

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

    【讨论】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      • 2012-08-13
      • 2018-04-14
      • 2017-06-15
      • 1970-01-01
      • 2013-06-30
      相关资源
      最近更新 更多