我正在尝试设置一个worker守护进程来处理来自rabbitmq的消息。我正在使用鼠兔及其SelectConnection。如果我不将它作为守护进程运行,代码工作正常。我可以用
py worker.py
和
py worker.py &
成功。但是,当我添加
import daemon
with daemon.DaemonContext():
connection.ioloop.start()
到worker.py,代码虽然不会引发任何异常,但会停止从队列中获取消息并最大限度地提高CPU利用率。 worker.py看起来与this示例完全相同。
感谢。
答案 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。