2

rabbitmq からのメッセージを処理するためのワーカー デーモンをセットアップしようとしています。私はピカとそのSelectConnectionを使用しています。デーモンとして実行しない場合、コードは正常に動作します。使うことができます

py worker.py

py worker.py &

成功しました。ただし、追加すると

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

コードは例外を発生させませんが、キューからのメッセージのフェッチを停止し、CPU 使用率を最大にします。worker.py はこの例とまったく同じです。

ありがとう。

4

1 に答える 1

3

まず、このデーモン モジュールをどこで入手しimportたかわかりませんが、あなたの例ではデーモンであることに気付きましたが、ピカではありません。

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

プロセスをデーモンに変える前に、pika を使用していると強く思います (import でさえモジュール内でコードを実行します)。これは、デーモンが fork するときにコピーされるリソースが RAM にあることを意味し、このデーモン モジュールが正しいことを行う場合、開いているソケットまたはファイルはプロセス中に強制的に閉じられます。

存続期間がデーモンの境界にまたがるオブジェクトを持たない方がよいでしょう。デーモンを他の処理から完全に分離して実行し、AMQP や 0MQ などのメッセージ パッシングを介して他のプロセスと通信させます。

于 2011-06-18T03:24:05.817 に答える