我可以在守护进程中运行pika的connection.ioloop.start()吗?

时间:2011-06-16 21:12:03

标签: python rabbitmq pika python-daemon

我正在尝试设置一个worker守护进程来处理来自rabbitmq的消息。我正在使用鼠兔及其SelectConnection。如果我不将它作为守护进程运行,代码工作正常。我可以用

py worker.py

py worker.py &

成功。但是,当我添加

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

到worker.py,代码虽然不会引发任何异常,但会停止从队列中获取消息并最大限度地提高CPU利用率。 worker.py看起来与this示例完全相同。

感谢。

1 个答案:

答案 0 :(得分:3)

首先,我不知道你在哪里有这个守护进程模块,但是我注意到你的示例中有import守护进程而不是pika。

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

我强烈怀疑你在将进程转换为守护进程之前使用pika(甚至导入在模块内执行代码)。这意味着你拥有RAM中的资源,这些资源在守护进程分叉时被复制,如果这个守护进程模块做正确的事情,那么在此过程中任何打开的套接字或文件都将被强制关闭。

最好没有任何其生命周期跨越守护程序边界的对象。使守护进程完全独立于任何其他处理运行,并让它们通过消息传递与其他进程通信,如AMQP或0MQ。