【问题标题】:How to check if celery task is already running before running it again with beat?如何在用beat再次运行之前检查芹菜任务是否已经运行?
【发布时间】:2019-12-11 13:16:35
【问题描述】:

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

如果上一个任务还没有完成,有什么办法可以使用celery beat 不打开任务?我在间隔设置中没有看到它的选项。

【问题讨论】:

  • 对于任何重复数据删除问题,您都在寻找锁定机制

标签: python django task celery scheduling


【解决方案1】:

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

实现您想要做的事情的一种方法是将任务链接到自身。例如,async_apply() 具有可选参数 linklink_error,可用于提供签名(也可以是单个任务)以在任务成功完成(链接)或不成功(链接错误)时运行。

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

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

【讨论】:

  • 我最终使用缓存来指示它是否已经运行。这确实带来了一些错误,例如,我有一个繁重的嵌套获取查询,它的设计考虑了很多失败点。所以我不得不重写我的代码,以便在退出任务之前,永远记得更新缓存变量。我也喜欢自定义调度器的声音,以后可能会实现它。
【解决方案2】:

你可以试试this 它为您的任务提供了一个单例基类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 2020-01-21
    相关资源
    最近更新 更多