Python ZeroMQ轮询器vs Tornados EventLoop

Python ZeroMQ轮询器vs Tornados EventLoop,python,tornado,zeromq,event-loop,poller,Python,Tornado,Zeromq,Event Loop,Poller,在设计和性能方面,建议采用哪种方法来处理多个Zeromq套接字?为什么 ZeroMQ使用的Tornado的iLoop比while循环中用于处理多个套接字的轮询器占用更少的CPU,这是真的吗?如果您在问题中添加自己的观察/分析,那就太好了 我不认为在性能上有什么区别,但在设计上有区别 如果是民意调查者 注册要轮询的套接字,然后使用if块识别并使用每个套接字 while should_continue: socks = dict(poller.poll()) if s

在设计和性能方面,建议采用哪种方法来处理多个Zeromq套接字?为什么


ZeroMQ使用的Tornado的iLoop比while循环中用于处理多个套接字的轮询器占用更少的CPU,这是真的吗?

如果您在问题中添加自己的观察/分析,那就太好了

我不认为在性能上有什么区别,但在设计上有区别

如果是民意调查者

注册要轮询的套接字,然后使用
if块
识别并使用每个套接字

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 ....
如果是eventloop 但是在处理多个套接字时,使用事件循环是非常优雅的,因为您注册了回调

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

stream_sub = zmqstream.ZMQStream(socket_sub)
stream_sub.on_recv(process_message)
从第二个示例中可以注意到,if块已删除。您将套接字消息传递操作写到别处,并在套接字就绪时注册回调方法<代码>在本例中,在_recv()上


我希望这能澄清你的问题。

PyZMQ重新实现的Tornado IO循环在幕后使用轮询器,因此不太可能一个会比另一个使用更多的CPU


有关详细信息,请参阅。

谢谢您的回复。从您的回答中可以明显看出,使用eventloop可能是有意义的,因为回调系统使代码更具可读性。我不确定哪一个更有效——因为eventloop使用了tornado iLoop,它是否也能让事情变得更快?@crashekar:不,我不认为它能提高性能,但正如我在回答中所建议的那样,当你在写更复杂的信息时,它会更优雅。您的循环由Tornado IO循环处理,它进行选择并调用您的回调。在一个更复杂的项目中,这很优雅,因为您还可以使用IO loop注册其他事件,并通过相同的设计界面调用它们。请让我深入探讨我问题的性能部分——while loop-poller构造占用更多CPU,而IOloop占用的CPU更少,这是真的吗?@crashekar:轮询应该是非忙等待。在等待套接字时,不应使用任何cpu。您是否遇到过任何明显的性能问题?