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

Как правильно перезапустить рабочие сельдерея при выпуске новой сборки для обновления кода в воркерах?

Изменить: я собираюсь сделать что-то вроде этого.

  • Рабочий работает, вероятно, загружает файл размером 100 МБ в S3
  • Приходит новая сборка
  • В рабочем коде есть изменения
  • Скрипт сборки посылает сигнал работникам
  • Запускает новых воркеров с новым кодом
  • Работники, получившие сигнал после завершения существующей работы, завершают работу.

person Quintin Par    schedule 19.03.2012    source источник


Ответы (8)


Новый рекомендуемый метод перезапуска воркера задокументирован здесь http://docs.celeryproject.org/en/latest/userguide/workers.html#restarting-the-worker

$ celery multi start 1 -A proj -l info -c4 --pidfile=/var/run/celery/%n.pid
$ celery multi restart 1 --pidfile=/var/run/celery/%n.pid

Согласно http://ask.github.com/celery/userguide/workers.html#restarting-the-worker можно перезапустить воркера, отправившего сигнал HUP.

 ps auxww | grep celeryd | grep -v "grep" | awk '{print $2}' | xargs kill -HUP
person armonge    schedule 19.03.2012
comment
sudo ps auxww | grep celeryd | grep -v "grep" | awk '{print $2}' | sudo xargs kill -HUP исключить grep :-) - person Quintin Par; 24.03.2012
comment
Вы можете заменить grep celeryd | grep -v grep с помощью grep [c] eleryd. Просто говорю. - person chanux; 11.10.2013
comment
Похоже, это не изящный перезапуск, не так ли? Как говорится в документации: помимо остановки и запуска рабочего для перезапуска, вы также можете перезапустить рабочего, используя сигнал HUP, но обратите внимание, что рабочий будет нести ответственность за перезапуск, поэтому это подвержено проблемам и не рекомендуется в производстве. как лучше всего перезагрузить Celery в продакшене, чтобы избежать сбоев? - person mennanov; 08.10.2014
comment
Для celery multi: для производственных развертываний следует использовать сценарии инициализации или другие системы контроля процессов. Что касается HUP: это чревато проблемами и не рекомендуется в производстве. - person webjunkie; 02.08.2016
comment
Это не работает, когда он не работает из-за ошибок памяти. - person User; 28.03.2017
comment
Документация по сельдерею кажется противоречивой по этому поводу; здесь говорится, что не используйте celery multi в производстве, но в разделе демонизации в примере конфигурационного файла systemd используется celery multi. - person GDorn; 11.01.2021

celery multi start 1 -A proj -l info -c4 --pidfile=/var/run/celery/%n.pid
celery multi restart 1 --pidfile=/var/run/celery/%n.pid

http://docs.celeryproject.org/en/latest/userguide/workers.html#restarting-the-worker

person zengr    schedule 10.03.2015
comment
Ух ... тут же сказано. Самый простой способ управлять рабочими для разработки - это использовать celery multi. Для производственных развертываний вы должны использовать сценарии инициализации или другие системы контроля процессов. Этот ответ не относится к запуску в производство! - person webjunkie; 02.08.2016
comment
@webjunkie OP не сказал при развертывании продукта, поэтому не уверен, зачем вам голосовать против, если это не было упомянуто в исходном вопросе. - person zengr; 02.08.2016
comment
Он также не сказал, что хочет найти решение, например, для среда тестирования. Многие люди не будут беспокоиться о том, чтобы читать больше, и опасно идут и используют решение, которое им кажется правильным. Так что будет справедливо упомянуть о недостатках, а не просто копировать и вставлять что-то из документации, игнорируя примечания и отбрасывая дальнейшие рекомендации. - person webjunkie; 03.08.2016
comment
Это не работает, когда сельдерей не работает из-за ошибок памяти. - person User; 28.03.2017

Если вы идете по маршруту kill, вам на помощь придет pgrep:

kill -9 `pgrep -f celeryd`

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

person JL Peyret    schedule 15.03.2016
comment
(pkill делает это более чистым способом) - person orzel; 27.06.2016
comment
не знал этого. Однако я по-прежнему предпочитаю видеть список процессов, которые будут убиты заранее: шаг 1 - настройте ваш pgrep, шаг 2 сделайте его оружием, скармливая его kill. - person JL Peyret; 23.05.2018

Ты можешь сделать:

celery multi restart w1 -A your_project -l info  # restart workers

Пример

person cảnh nguyễn    schedule 05.06.2019

Вам следует взглянуть на автозагрузку в Celery.

person sebasmagri    schedule 19.03.2012
comment
Это похоже на эксперимент This is an experimental feature intended for use in development only, using auto-reload in production is discouraged as the behavior of reloading a module in Python is undefined - person Quintin Par; 19.03.2012
comment
Также имейте в виду, что включение этого флага может привести к запуску потерянных процессов, что, в свою очередь, приведет к некорректной работе бэкэнда. - person eviltnan; 20.03.2016
comment
Параметры автоматической перезагрузки, похоже, были удалены из Celery 4 - person Mark Chackerian; 18.04.2017

Что должно произойти с длительными задачами? Мне это нравится: длительные задачи должны делать свое дело. Не прерывайте их, только новые задачи должны получать новый код.

Но в настоящий момент это невозможно: https://groups.google.com/d/msg/celery-users/uTalKMszT2Q/-MHleIY7WaIJ.

person guettli    schedule 23.05.2013

Я неоднократно тестировал решение -HUP с помощью автоматизированного сценария, но обнаружил, что примерно в 5% случаев рабочий перестает брать новые задания после перезапуска.

Более надежное решение:

stop <celery_service>
start <celery_service>

который я использовал сотни раз без каких-либо проблем.

Изнутри Python вы можете запустить:

import subprocess
service_name = 'celery_service'
for command in ['stop', 'start']:
    subprocess.check_call(command + ' ' + service_name, shell=True)
person crunk_monad    schedule 29.04.2015

Может быть, опоздал на вечеринку. Я использую:

sudo systemctl stop celery

sudo systemctl start celery

sudo systemctl status celery

person Denis Kanygin    schedule 06.01.2021