複数のZeromqソケットを処理するために推奨されるアプローチとその理由は、設計上およびパフォーマンス上です。
ZeroMQで使用されるTornadoのIOLoopは、複数のソケットを処理するためのwhileループで使用されるPollerよりもCPUの占有率が低いというのは本当ですか?
複数のZeromqソケットを処理するために推奨されるアプローチとその理由は、設計上およびパフォーマンス上です。
ZeroMQで使用されるTornadoのIOLoopは、複数のソケットを処理するためのwhileループで使用されるPollerよりもCPUの占有率が低いというのは本当ですか?
質問に独自の観察/分析を追加するとよいでしょう。
性能に違いはないと思いますが、デザインに違いがあります。
ポーラーの場合
ポーリングするソケットを登録してから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()
あなたの質問が明確になることを願っています。
PyZMQ によって再実装された Tornado IO ループは、とにかく舞台裏でポーラーを使用するため、一方が他方よりも多くの CPU を使用することはまずありません。
詳細については、 https://github.com/zeromq/pyzmq/blob/master/zmq/eventloop/ioloop.pyを参照してください。