2012-06-25 74 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