2

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

py worker.py

py worker.py &

成功地。但是,当我添加

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

到worker.py,代码虽然没有引发任何异常,但会停止从队列中获取消息并最大化我的CPU利用率。worker.py 看起来和这个例子一模一样。

谢谢。

4

1 回答 1

3

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

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

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

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

于 2011-06-18T03:24:05.817 回答