设计明智和性能明智,建议使用哪种方法来处理多个 Zeromq 套接字,为什么?
ZeroMQ 使用的 Tornado 的 IOLoop 占用的 CPU 是否比 while 循环中用于处理多个套接字的轮询器占用的 CPU 少?
设计明智和性能明智,建议使用哪种方法来处理多个 Zeromq 套接字,为什么?
ZeroMQ 使用的 Tornado 的 IOLoop 占用的 CPU 是否比 while 循环中用于处理多个套接字的轮询器占用的 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)
从第二个示例中您可以注意到, if 块已被删除。您在其他地方编写您的套接字消息传递操作,并在套接字准备好时注册您的回调方法。In this case on_recv()
我希望这能澄清你的问题。
由 PyZMQ 重新实现的 Tornado IO 循环无论如何都在幕后使用轮询器,因此不太可能使用比另一个更多的 CPU。
有关详细信息,请参阅https://github.com/zeromq/pyzmq/blob/master/zmq/eventloop/ioloop.py。