Предотвращение двуличия при планировании задач с помощью сельдерея - PullRequest
4 голосов
/ 02 апреля 2020

У меня есть задача, которую я периодически запускаю (каждую минуту) с помощью Celery Beat. В некоторых случаях выполнение задачи может занять больше минуты, чтобы завершить sh ее выполнение, в результате чего планировщик добавляет эту задачу в очередь, когда задача уже выполняется.

Есть ли способ, которого можно избежать планировщик, добавляющий задачи в очередь, если эти задачи уже выполняются?

Редактировать: Я видел Удар сельдерея: ограничение на один экземпляр задачи за раз

Обратите внимание, что мой вопрос другой. Я спрашиваю, как избежать постановки задачи на , в то время как этот вопрос спрашивает, как избежать запуска задачи несколько раз.

1 Ответ

2 голосов
/ 07 апреля 2020

У меня не было этой конкретной проблемы, но у меня была похожая, где мне приходилось избегать применения задач, когда задача того же рода уже выполнялась или находилась в очереди, но без Celery Beat. Я пошел по тому же маршруту, с механизмом блокировки, как ответ, который вы связали здесь. К сожалению, здесь будет не так просто, потому что вы хотите избежать очереди.

Насколько я знаю, Celery не поддерживает ничего подобного из коробки. Я думаю, что вам лучше всего написать собственный планировщик, который наследует от Scheduler, а затем переписать метод apply_entry или apply_async метод . Там вам понадобится механизм блокировки, чтобы проверить, выполняется ли уже задача, то есть в наборе задач и снимите блокировку, а в apply_async проверьте эту блокировку. Вы можете использовать RedLock , если Redis уже запущен.

...