ZeroMQ Poller与Tornado的EventLoop对比

5

在处理多个Zeromq套接字时,从设计和性能方面考虑,哪种方法是推荐的?为什么?

Tornado使用的IOLoop比while循环中使用的Poller来处理多个套接字更节省CPU,这是真的吗?

2个回答

4

如果您在问题中添加自己的观察/分析,那将会很好。

我认为性能上没有任何区别,但设计上有所不同。

在轮询器的情况下

您注册要轮询的套接字,然后使用 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 ....

关于事件循环 当你处理多个套接字时,使用事件循环非常优雅,因为你可以注册回调函数

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

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

从第二个例子中可以看出,if块被移除了。你需要在其他地方编写socket消息操作,并在socket准备就绪时注册回调方法。 在这种情况下,on_recv()

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


感谢您的回复。从您的答案中可以明显看出,使用事件循环可能是有意义的,因为回调系统使代码更易读。我不确定哪种方法更有效 - 因为事件循环使用tornado IOLoop,它是否也会使事情更快? - crashekar
@crashekar:我不认为它会提高性能,但正如我在答案中建议的那样,当您编写更复杂的信息时,它更加优雅。您的循环由Tornado IO循环处理,并且它会选择并调用您的回调函数。在更复杂的项目中,这是优雅的,因为您还可以使用IO循环注册其他事件,并通过相同的设计接口调用它们。 - pyfunc
让我更深入地探究一下我的问题的性能部分 - 是否真的是while循环 - 轮询器结构占用了更多的CPU和IOloop则不太需要CPU? - crashekar
@crashekar:轮询应该是非繁忙等待的。在等待套接字时不应有任何 CPU 使用率。您是否遇到了明显的性能问题? - pyfunc

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接