Подтвердить что ты не робот

Как я могу с легкостью перезапустить работников сельдерея?

При выпуске новой сборки для обновления кода у работников, как я могу изящно перезапустить работников сельдерея?

Edit: То, что я намереваюсь сделать, это нечто подобное.

  • Рабочий работает, возможно, загружая 100 МБ файл в S3
  • Добавлена ​​новая сборка
  • Рабочий код имеет изменения
  • Строка script загорается сигналом Рабочий (ы)
  • Запускает новых сотрудников с новым кодом
  • Работник (ы), который получил сигнал после завершения существующего выхода работы.
4b9b3361

Ответ 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

Ответ 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

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