【问题标题】:Preventing duplicity while scheduling tasks with celery beat在使用 celery beat 安排任务时防止重复
【发布时间】:2020-07-14 08:25:27
【问题描述】:

我有一个通过 Celery Beat 定期(每分钟)运行的任务。有时,任务需要超过一分钟才能完成执行,这会导致调度程序在任务已经运行时将该任务添加到队列中。

如果这些任务已经在运行,是否有办法避免调度程序将任务添加到队列中?

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

请注意,我的问题有所不同。我在问如何避免我的任务被排队,而这个问题是在问如何避免任务被多次运行。

【问题讨论】:

    标签: python celery django-celery celerybeat


    【解决方案1】:

    我没有遇到过这个特殊的问题,但有一个类似的问题,当同类任务已经在运行或排队但没有 Celery Beat 时,我必须避免应用任务。我走了一条类似的路线,带有锁定机制,作为您在此处链接的答案。不幸的是,这里不会那么容易,因为您想避免已经排队。

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

    【讨论】: