Ответ 1
Если бы я был вами, я бы установил специальную очередь для любых заданий, которые невозможно выполнить одновременно. Затем вы можете просто запустить отдельного работника только для этой очереди.
Как вы препятствуете выполнению периодической задачи Сельдерей до завершения предыдущего выполнения?
У меня есть кластер серверов, связанных с общим сервером базы данных, выполняющий задачи Celery, и я нахожу, что каждый сервер может иногда запускать одну и ту же задачу одновременно, а также разные серверы, выполняющие эту же задачу одновременно. Это вызывает множество условий гонки, которые искажают мои данные болезненно тонкими способами.
Я читал Документы Celery, но я не могу найти какой-либо опции, которая явно разрешает это. Я нашел аналогичный вопрос, но предлагаемое исправление кажется взломом, поскольку оно основывается на структуре кэширования Django и, следовательно, может не использоваться всеми серверами в кластере, позволяя нескольким серверам выполнять одну и ту же задачу одновременно.
Есть ли какой-либо вариант в Celery для записи того, какие задачи выполняются в настоящее время в базе данных, и не запускаться снова до тех пор, пока запись базы данных не будет очищена?
Я использую модуль Django-Celery, и даже если он предоставляет страницы /admin/djcelery/taskstate/and/admin/djcelery/workerstate/, я никогда там появляются рабочие задачи или рабочие.
Если бы я был вами, я бы установил специальную очередь для любых заданий, которые невозможно выполнить одновременно. Затем вы можете просто запустить отдельного работника только для этой очереди.
Стандартный способ - использовать общий замок через стандартный механизм кэширования django. См. этот рецепт из официальной документации