Сельдерей: застрял в бесконечно повторяющихся тайм-аутах (истекло время ожидания сообщения UP)

#python #timeout #celery

#python #тайм-аут #сельдерей

Вопрос:

Я определил некоторые задачи с ограничением по времени 1200:

 @celery.task(time_limit=1200)
def create_ne_list(text):
    c = Client()
    return c.create_ne_list(text)
  

Я также использую worker_process_init сигнал для выполнения некоторой инициализации при каждом запуске нового процесса:

 @worker_process_init.connect
def init(sender=None, conf=None, **kwargs):
    init_system(celery.conf)
    init_pdf(celery.conf)
  

Выполнение этой функции инициализации занимает несколько секунд.

Кроме того, я использую следующую конфигурацию:

 CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['json']
BROKER_URL = 'amqp://'
CELERY_RESULT_BACKEND = 'amqp://'
CELERY_TIMEZONE = 'Europe/Berlin'
CELERY_ENABLE_UTC = True
  

и запустите моего рабочего со следующей командой:

 celery -A isc worker -l info --concurrency=3
  

Как и ожидалось, запуск рабочего приводит к тому, что функция инициализации вызывается три раза. Теперь я могу отправлять задачи, и они выполняются, и все, кажется, проходит гладко.

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

 [2014-06-13 09:46:18,978: ERROR/MainProcess] Timed out waiting for UP message from <Worker(Worker-20381, started daemon)>
[2014-06-13 09:46:20,000: ERROR/MainProcess] Process 'Worker-20381' pid:18953 exited with 'signal 9 (SIGKILL)'
// new worker 20382 getting started, initialization getting triggerd and soon after that -->
[2014-06-13 09:46:18,978: ERROR/MainProcess] Timed out waiting for UP message from <Worker(Worker-20382, started daemon)>
[2014-06-13 09:46:20,000: ERROR/MainProcess] Process 'Worker-20382' pid:18954 exited with 'signal 9 (SIGKILL)'
// and so on....
  

У кого-нибудь есть идея, почему это происходит?

Ответ №1:

Ответ, похоже, заключается в том, что сигнал worker_process_init требует, чтобы обработчик не блокировался более 4 секунд.

http://celery.readthedocs.org/en/latest/userguide/signals.html#worker-process-init

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

Комментарии:

1. Вы можете использовать сигнал task_prerun для выполнения инициализации при запуске первой задачи