2012-06-25 36 views
4

设计明智且性能明智哪种方法推荐用于处理多个Zeromq套接字,为什么?ZeroMQ Poller与Tornados EventLoop

确实,ZeroMQ使用的Tornado的IOLoop的处理多个套接字的时间比在while循环中使用的轮询器少了多少CPU?

回答

3

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

我不认为在性能上有任何区别,但是在设计上存在差异。

在轮询

的情况下,您注册的插座进行调查,然后你用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()

我希望澄清你的问题。

+0

感谢您的回复。从你的回答可以明显看出,使用eventloop是有意义的,因为回调系统使得代码更具可读性。我不确定哪个更有效率 - 由于eventloop使用龙卷风IOLoop,它也使事情变得更快吗? – crashekar

+0

@crashekar:不,我认为它不会增加性能,但是如我在答案中所建议的那样,当你写更复杂的信息时,它会更加优雅。您的循环由Tornado IO循环处理,并执行选择并调用您的回调。在一个更复杂的项目中,这是很优雅的,因为你还通过IO循环注册了其他事件,并通过相同的设计界面调用它们 – pyfunc

+0

让我深入挖掘我的问题的性能部分 - 是真的,while循环 - 轮询构造猪多CPU和IOloop更少CPU密集? – crashekar