5

複数のZeromqソケットを処理するために推奨されるアプローチとその理由は、設計上およびパフォーマンス上です。

ZeroMQで使用されるTornadoのIOLoopは、複数のソケットを処理するためのwhileループで使用されるPollerよりもCPUの占有率が低いというのは本当ですか?

4

2 に答える 2

4

質問に独自の観察/分析を追加するとよいでしょう。

性能に違いはないと思いますが、デザインに違いがあります。

ポーラーの場合

ポーリングするソケットを登録してからif blocks、各ソケットを識別して操作するために使用します。

while should_continue:
        socks = dict(poller.poll())
        if socket_pull in socks and socks[socket_pull] == zmq.POLLIN:
            Work_on_socket_pull ....

        if socket_sub in socks and socks[socket_sub] == zmq.POLLIN:
             Work_on_socket_sub ....

イベントループの場合 しかし、複数のソケットを扱っている場合、イベントループを使用するのは非常にエレガントですregister callbacks

stream_pull = zmqstream.ZMQStream(socket_pull)
stream_pull.on_recv(getcommand)

stream_sub = zmqstream.ZMQStream(socket_sub)
stream_sub.on_recv(process_message)

2 番目の例からわかるように、if ブロックが削除されています。ソケットメッセージング操作を別の場所に記述し、ソケットの準備ができたらコールバックメソッドを登録します。In this case on_recv()

あなたの質問が明確になることを願っています。

于 2012-06-25T15:51:14.107 に答える
1

PyZMQ によって再実装された Tornado IO ループは、とにかく舞台裏でポーラーを使用するため、一方が他方よりも多くの CPU を使用することはまずありません。

詳細については、 https://github.com/zeromq/pyzmq/blob/master/zmq/eventloop/ioloop.pyを参照してください。

于 2012-06-26T12:00:47.980 に答える