Назад | Перейти на главную страницу

Изящный перезапуск экземпляров Django Celery

Мне интересно, как лучше всего перезапустить Celery без потери каких-либо задач во время перезапуска.

В настоящее время я запускаю его как демон, используя init.d / script, поставляемый с сельдереем - все работает отлично.

Тем не менее, мне нужно будет перезапустить его (я думаю?), Чтобы увидеть обновления кода. Меня беспокоит, что если кто-то загружает фотографию, и мы хотим обработать ее в течение тех 5 секунд или около того, когда сельдерей перезапускает задачу, задача будет потеряна навсегда, и мы начнем видеть странные проблемы.

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

Спасибо,

Фил

Вы можете безопасно перезапустить celery worker без потери каких-либо задач с сигналом TERM. Так сельдерей закончит текущие задачи и умрет.

Если вы хотите, чтобы ваши задачи были повторены, если что-то пойдет не так, вы также можете использовать параметр acks_late (Task.acks_late / CELERY_ACKS_LATE).

Q: Как я могу безопасно выключить воркер? (из: http://celery.readthedocs.org/en/latest/faq.html#how-can-i-safely-shut-down-the-worker)

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

Никогда не следует останавливать worker сигналом KILL (-9), если вы не попробовали TERM несколько раз и не подождали несколько минут, чтобы дать ему шанс отключиться. Как будто вы выполняете задачи, они могут быть прерваны в середине выполнения, и они не будут запускаться повторно, если у вас не установлен параметр acks_late (Task.acks_late / CELERY_ACKS_LATE).

Чтобы остановить воркера (от: http://celery.readthedocs.org/en/latest/userguide/workers.html#worker-stopping)

Q: Остановка рабочего

Отключение должно выполняться с помощью сигнала TERM.

Чтобы отправить сигнал TERM, используйте команду Linux KILL (из: http://linux.about.com/od/commands/l/blcmdl1_kill.htm)

kill - завершить процесс ОБЗОР

kill [-s сигнал | -p] [-a] [-] pid ... kill -l [сигнал] ОПИСАНИЕ

Команда kill отправляет указанный сигнал указанному процессу или группе процессов. Если сигнал не указан, отправляется сигнал TERM. Сигнал TERM завершает процессы, которые не улавливают этот сигнал. Для других процессов может потребоваться использование сигнала KILL (9), поскольку этот сигнал не может быть перехвачен.