Как я могу с легкостью перезапустить работников сельдерея?
При выпуске новой сборки для обновления кода у работников, как я могу изящно перезапустить работников сельдерея?
Edit:
То, что я намереваюсь сделать, это нечто подобное.
- Рабочий работает, возможно, загружая 100 МБ файл в S3
- Добавлена новая сборка
- Рабочий код имеет изменения
- Строка script загорается сигналом Рабочий (ы)
- Запускает новых сотрудников с новым кодом
- Работник (ы), который получил сигнал после завершения существующего выхода работы.
Ответы
Ответ 1
Новый рекомендованный метод перезапуска рабочего документа описан здесь 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
Ответ 2
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
Ответ 3
Если вы идете по маршруту kill
, pgrep на помощь:
kill -9 `pgrep -f celeryd`
Помните, что это не долгосрочная задача, и меня не волнует, жестоко ли она прекращается. Просто перезагрузите новый код во время dev. Я бы пошел по маршруту возобновления службы, если он был более чувствительным.
Ответ 4
Вы должны посмотреть на Сельдерей autoreloading
Ответ 5
Я неоднократно тестировал решение -HUP с помощью автоматизированного script, но обнаружил, что примерно в 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)
Ответ 6
Что должно случиться с долговременными задачами? Мне это нравится: долгие задачи должны выполнять свою работу. Не прерывайте их, только новые задачи должны получить новый код.
Но на данный момент это невозможно: https://groups.google.com/d/msg/celery-users/uTalKMszT2Q/-MHleIY7WaIJ
Ответ 7
В настоящее время я смотрю на решение @codeape
В основном - "истощение" задач от работника, которого вы хотите перезапустить, выполняя очередь, чтобы она не получала новые задачи.
Ответ 8
Ты можешь сделать:
мульти-перезапуск сельдерея w1 -A your_project -l info # перезапуск рабочих введите описание ссылки здесь