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

12
如何防止Celery在上一次执行完成之前执行定期任务?
我有一个服务器集群,连接到一个共同的数据库服务器,执行Celery任务,我发现每个服务器偶尔会同时运行相同的任务,以及不同的服务器同时运行相同的任务。这导致了很多竞争条件,在痛苦微妙的方式下破坏了我的数据。
我已经阅读了Celery的文档,但我找不到任何明确允许此选项的选项。我找到了一个类似的问题,但建议的修复似乎像一个黑客,因为它依赖于Django的缓存框架,因此可能不被集群中的所有服务器共享,从而允许多个服务器同时执行相同的任务。
在Celery中是否有任何选项可以记录当前正在运行的任务,并在清除数据库记录之前不再运行?

我正在使用Django-Celery模块,虽然它提供了/admin/djcelery/taskstate/和/admin/djcelery/workerstate/页面,但我从来没有在那里看到任何长时间运行的任务或工作者。

2个回答

4

标准方法是使用Django标准缓存机制中的共享锁。参见官方文档中的这个示例。


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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接