Выполнение только одной задачи за один раз в сельдерее - PullRequest
4 голосов
/ 23 июня 2011

У меня есть задача, которую я выполняю раз в минуту с помощью сельдерея. Работает нормально. Однако иногда выполнение задачи занимает несколько секунд больше минуты, из-за чего запускаются два экземпляра задачи. Это приводит к некоторым условиям гонки, которые все портят.

Я могу (и, вероятно, должен) исправить свою задачу, чтобы она работала должным образом, но я хотел знать, есть ли у сельдерея какие-либо встроенные способы для обеспечения этого. Мой беглый поиск в Google и RTFM не дали результатов.

Ответы [ 4 ]

2 голосов
/ 02 мая 2012

Вы можете добавить блокировку , используя что-то вроде memcached или просто вашу базу данных.

1 голос
/ 27 июня 2011

Если вы используете расписание cron или интервал времени для запуска периодических задач, у вас все еще будет проблема. Вы всегда можете использовать механизм блокировки с использованием БД или кеша или даже файловой системы или также запланировать следующую задачу из предыдущей, возможно, не лучший подход. Этот вопрос, вероятно, может помочь вам: django celery: как программно настроить задание на определенный интервал

0 голосов
/ 01 июля 2015

Блокировка - хороший способ либо с битом, либо с кроной.

Но имейте в виду, что задания по ритму выполняются во время запуска рабочего , а не во время выполнения удара.

Это приводило меня к состоянию гонки даже с замком.Допустим, рабочий выключен, а в такт выбрасывает 10 заданий в очередь.Когда сельдерей запускается с 4 процессами, все 4 из них берут задачу, и в моем случае 1 или 2 получат и установят блокировку одновременно.

Первым решением является использование cron с блокировкой, поскольку cron будет выполняться в это время, а не во время запуска работника.

Вторым решением является использование немного более продвинутого механизма блокировки, которыйобрабатывает условия гонки.Для redis посмотрите на setnx или более новый redlock .Этот пост действительно хорош и включает шаблон декоратора, который использует механизм блокировки redis-py: http://loose -bits.com / 2010/10 / распределенная задача-блокировка-в-сельдерее. Html .

0 голосов
/ 23 июня 2011

Вы можете попробовать добавить поле класса к объекту, который содержит функцию, которую вы выполняете, и использовать это поле в качестве элемента управления "работает или нет другой человек"

...