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

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

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

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

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

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


person Cerin    schedule 28.03.2012    source источник


Ответы (2)


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

person BenH    schedule 23.04.2012

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

person Alexander Lebedev    schedule 28.03.2012
comment
И, как я уже упоминал, это ненадежный механизм в настройке кластера... Почему нет варианта, использующего базу данных? - person Cerin; 29.03.2012
comment
Используйте бэкэнд memcached, и вы получите функциональность кластера - person Alexander Lebedev; 29.03.2012
comment
@AlexLebedev, это хороший момент, но если и только если машины в кластере совместно используют серверную часть. Например, вполне возможно запускать memcached локально и использовать бэкэнд memcached на локальном хосте на каждом компьютере. Логически очевидно, но я просто хотел указать на это, чтобы никто не подумал: «О, я использую memcached, проблема решена». - person mrooney; 03.04.2014