Почему сельдерей не закрывается чисто? - PullRequest
11 голосов
/ 02 апреля 2012

После выдачи сигнала TERM работнику Celery дважды («Теплое отключение» и «Холодное отключение») с использованием прерывания клавиатуры Ctlr-C работник «Celery» просто повесил трубку.Он не потребляет сообщения и не выполняет задачи (как и ожидалось), но и не закрывается.

Я запустил strace в процессах Celery, чтобы увидеть, что происходит за сценой.Вот вывод strace для PID основного процесса Celery

strace -p 27867
Process 27867 attached - interrupt to quit
futex(0xb966a78, FUTEX_WAIT, 0, NULL

А вот что я обнаружил, делая strace для дочерних процессов:

strace -p 27874
Process 27874 attached - interrupt to quit
select(4, [3], NULL, NULL, {0, 562000}) = 0 (Timeout)
futex(0x871a808, FUTEX_WAKE, 1)         = 0
select(4, [3], NULL, NULL, {1, 0})      = 0 (Timeout)
futex(0x871a808, FUTEX_WAKE, 1)         = 0
......................................................

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

Программный стек: Python 2.6.2, Celery 2.4.6, CentOS 5.0

ОБНОВЛЕНИЕ: загрузка ЦП снижена почти до 0%.Эти задачи довольно интенсивно загружают процессор, поэтому это подтверждает, что в данный момент они не активны.

1 Ответ

3 голосов
/ 02 апреля 2012

Из документов :

Если работник не отключится через некоторое время, например, из-за задач, застрявших в бесконечном цикле, вы можете использовать команду KILLсигнал принудительного завершения работы, но имейте в виду, что выполняемые в настоящий момент задачи будут потеряны (если только для задач не установлена ​​опция acks_late).

Также из групп Google :

celeryd не отключится, пока не будут обработаны все активные задачи, где под активными подразумеваются задачи, которые были запущены (не все зарезервированные задачи).Зарезервированные сообщения будут освобождены и доставлены после закрытия канала подключения.Это происходит после возвращения активных задач.если у вас не включен параметр -time-limit, celeryd никогда не убьет ваши задачи при завершении работы, даже если для их завершения потребуются ДНИ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...