Как обеспечить выполнение задачи Celery Предотвращение дублирования выполнения задачи Celery - PullRequest
12 голосов
/ 29 марта 2012

Как вы препятствуете Celery выполнять периодическое задание до завершения предыдущего выполнения?

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

Я перечитывал документы Сельдерея , но я не могу найти ни одного варианта, который бы явно разрешал это. Я нашел похожий вопрос , но предложенное исправление выглядит как хак, поскольку оно опирается на инфраструктуру кэширования Django и поэтому может не использоваться всеми серверами в кластере, что позволяет нескольким серверам по-прежнему выполнять одно и то же задание одновременно.

Есть ли какая-либо опция в Celery, чтобы записывать, какие задачи выполняются в данный момент в базе данных, и не запускать снова, пока запись в базе данных не будет очищена?

Я использую модуль Django-Celery, и хотя он предоставляет pages / admin / djcelery / taskstate / и / admin / djcelery / workertate /, я никогда не видел долгое время задачи или рабочие появляются там.

Ответы [ 2 ]

4 голосов
/ 29 марта 2012

Стандартный способ - использовать разделяемую блокировку через стандартный механизм кэширования django. См. этот рецепт из официальной документации

2 голосов
/ 23 апреля 2012

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

...