Могу ли я запустить pika's connection.ioloop.start () в демоне? - PullRequest
2 голосов
/ 17 июня 2011

Я пытаюсь настроить рабочий демон для обработки сообщений от rabbitmq.Я использую Пика и его SelectConnection.Код работает нормально, если я не запускаю его как демон.Я могу успешно использовать

py worker.py

и

py worker.py &

.Однако, когда я добавляю

import daemon
with daemon.DaemonContext():
    connection.ioloop.start()

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

спасибо.

1 Ответ

3 голосов
/ 18 июня 2011

Во-первых, я понятия не имею, откуда у вас этот модуль демона, но я заметил, что вы import демон в вашем примере, но не pika.

import daemon
with daemon.DaemonContext():
    import pika
    # any additional pika code here, maybe the creation of connection?
    connection.ioloop.start()

Я сильно подозреваю, что вы используете pika (даже импорт выполняет код внутри модуля), прежде чем превратить процесс в демон. Это будет означать, что у вас есть ресурсы в оперативной памяти, которые копируются, когда демон разветвляется, и если этот модуль демона делает правильные вещи, то все открытые сокеты или файлы будут вынуждены закрываться во время процесса.

Лучше не иметь никаких объектов, чье время жизни охватывает границу демона. Сделайте так, чтобы демоны работали совершенно отдельно от любой другой обработки, и заставляли их взаимодействовать с другими процессами посредством передачи сообщений, таких как AMQP или 0MQ.

...