在安排芹菜拍子的同时防止重复

问题描述 投票:4回答:1

我有一个任务,我通过Celery Beat定期(每分钟)运行。有时,该任务将花费一分钟以上的时间来完成其执行,这导致调度程序在任务已经运行时将该任务添加到队列中。

是否有办法避免调度程序将任务添加到队列中?

编辑:我见过Celery Beat: Limit to single task instance at a time

请注意,我的问题不同。我在问如何避免任务被[[enqueued占用,而那个问题是在问如何避免任务被多次运行。

python celery django-celery celerybeat
1个回答
2
投票
我没有这个特殊的问题,但是有一个类似的问题,当相同类型的任务已经在运行或排队但没有Celery Beat时,我必须避免应用任务。我沿着类似的路线走了,采用了锁定机制,这就是您在此处链接的答案。不幸的是,这里要避免排队已经不是那么容易了。

据我所知,Celery不支持这种开箱即用的功能。我猜您最好的选择是编写一个自Scheduler继承的自定义调度程序,然后覆盖apply_entry methodapply_async method。在这里,您需要一种锁定机制来检查任务是否已在运行,即在任务集中并释放一个锁定,然后在apply_async中检查该锁定。如果已经运行Redis,则可以使用RedLock

© www.soinside.com 2019 - 2024. All rights reserved.