【发布时间】:2012-06-25 15:36:57
【问题描述】:
在设计和性能方面推荐哪种方法来处理多个 Zeromq 套接字?为什么?
ZeroMQ 使用的 Tornado 的 IOLoop 是否比 while 循环中用于处理多个套接字的 Poller 占用的 CPU 更少?
【问题讨论】:
标签: python tornado zeromq event-loop poller
在设计和性能方面推荐哪种方法来处理多个 Zeromq 套接字?为什么?
ZeroMQ 使用的 Tornado 的 IOLoop 是否比 while 循环中用于处理多个套接字的 Poller 占用的 CPU 更少?
【问题讨论】:
标签: python tornado zeromq event-loop poller
如果您将自己的观察/分析添加到您的问题中,那就太好了。
我认为性能没有任何差异,但设计有差异。
在轮询的情况下
您注册要轮询的套接字,然后使用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。
【讨论】: