如何在用beat再次运行之前检查芹菜任务是否已经运行?

cmc*_*ake 7 python django scheduling task celery

我有一个计划每 10 分钟运行一次的定期任务。有时此任务在 2-3 分钟内完成,有时需要 20 分钟。

如果上一个任务尚未完成,有没有办法使用celery beats 不打开任务?我在间隔设置中没有看到它的选项。

Dej*_*kic 6

不,Celery Beat 对正在运行的任务一无所知。

实现您正在尝试做的事情的一种方法是将任务与其自身相关联。async_apply()中的示例具有可选的参数linklink_error其可被用来提供一个签名(它可以是一个单任务太)如果任务成功(链接)或不成功(link_error)结束运行。

我使用的是以下内容 - 我安排任务经常运行(比如每 5 分钟),并且我使用分布式锁来确保我始终只有一个任务实例正在运行。

最后提醒一下 - 您始终可以实现自己的调度程序,并在您的节拍配置中使用它。过去我曾考虑过为您想要的完全相同的东西执行此操作,但决定我已经拥有的解决方案对我来说已经足够了。

  • 我最终使用缓存来指示它是否已经在运行。这确实带来了一些错误,例如,我有一个重型嵌套获取查询,其设计时考虑到了很多失败点。所以我必须重写我的代码,以便在退出任务之前,始终记住更新缓存变量。我也确实喜欢自定义调度程序的声音,并且可能稍后会实现它。 (2认同)