如何阻止Celery在上一次执行完成之前执行定期任务?
我有一个服务器集群,链接到一个公共数据库服务器,执行Celery任务,我发现每个服务器可能偶尔同时运行相同的任务以及同时运行同一任务的不同服务器。这导致了很多竞争条件,这些竞争条件以极其微妙的方式破坏了我的数据。
我一直在阅读Celery's docs,但我找不到任何明确允许此选项的选项。我找到了similar question,但建议的修复看起来像是一个黑客,因为它依赖于Django的缓存框架,因此可能不会被集群中的所有服务器共享,从而允许多个服务器仍然执行相同的任务。同一时间。
Celery中是否有任何选项可以记录数据库中当前正在运行的任务,并且在清除数据库记录之前不再运行?
我正在使用Django-Celery模块,即使它提供了pages / admin / djcelery / taskstate /和/ admin / djcelery / workerstate /,我永远不会看到任何长正在运行的任务或工人出现在那里。
答案 0 :(得分:4)
标准方法是通过django标准缓存机制使用共享锁。请参阅官方文档中的this recipe
答案 1 :(得分:2)
如果我是你,我会为任何无法同时执行的作业设置一个特殊队列。然后,您只需为该队列启动一个单独的工作程序。