我有一个任务,我通过Celery Beat定期(每分钟)运行。有时,该任务将花费一分钟以上的时间来完成其执行,这导致调度程序在任务已经运行时将该任务添加到队列中。
是否有办法避免调度程序将任务添加到队列中?
编辑:我见过Celery Beat: Limit to single task instance at a time
请注意,我的问题不同。我在问如何避免任务被[[enqueued占用,而那个问题是在问如何避免任务被多次运行。
据我所知,Celery不支持这种开箱即用的功能。我猜您最好的选择是编写一个自Scheduler
继承的自定义调度程序,然后覆盖apply_entry
method或apply_async
method。在这里,您需要一种锁定机制来检查任务是否已在运行,即在任务集中并释放一个锁定,然后在apply_async
中检查该锁定。如果已经运行Redis,则可以使用RedLock。