我有一个计划每 10 分钟运行一次的定期任务。 有时此任务在 2-3 分钟内完成,有时需要 20 分钟。
如果上一个任务尚未完成,有没有办法使用芹菜节拍不打开任务? 我在间隔设置中看不到它的选项。
不,Celery Beat 对运行任务一无所知。
实现您正在尝试执行的操作的一种方法是将任务链接到自身。 例如,async_apply() 具有可选的参数link
和link_error
,可用于提供签名(也可以是单个任务),以便在任务成功完成(链接)或不成功(link_error)时运行。
我使用的如下 - 我安排任务频繁运行(例如每 5 分钟运行一次),并且我使用分布式锁来确保我始终只有一个任务实例在运行。
最后提醒一下 - 您始终可以实现自己的调度程序,并在节拍配置中使用它。我过去曾考虑这样做是为了您想要的完全相同的事情,但决定我已经拥有的解决方案对我来说已经足够了。
你可以试试这个 它为您的任务提供了一个单一实例基类。
我将Celery与Django模型一起使用,并在模型级别实现了布尔has_task_running
。然后,对于 Celery 信号,我将标志的状态更改为True
当信号before_task_publish
被触发时,False
当任务终止时。不简单,但灵活。