設計明智且性能明智哪種方法推薦用於處理多個Zeromq套接字,爲什麼?ZeroMQ Poller與Tornados EventLoop
確實,ZeroMQ使用的Tornado的IOLoop的處理多個套接字的時間比在while循環中使用的輪詢器少了多少CPU?
設計明智且性能明智哪種方法推薦用於處理多個Zeromq套接字,爲什麼?ZeroMQ Poller與Tornados EventLoop
確實,ZeroMQ使用的Tornado的IOLoop的處理多個套接字的時間比在while循環中使用的輪詢器少了多少CPU?
如果您將自己的觀察/分析添加到您的問題中,那將會很好。
我不認爲在性能上有任何區別,但是在設計上存在差異。
在輪詢
的情況下,您註冊的插座進行調查,然後你用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瞭解詳情。
感謝您的回覆。從你的回答可以明顯看出,使用eventloop是有意義的,因爲回調系統使得代碼更具可讀性。我不確定哪個更有效率 - 由於eventloop使用龍捲風IOLoop,它也使事情變得更快嗎? – crashekar
@crashekar:不,我認爲它不會增加性能,但是如我在答案中所建議的那樣,當你寫更復雜的信息時,它會更加優雅。您的循環由Tornado IO循環處理,並執行選擇並調用您的回調。在一個更復雜的項目中,這是很優雅的,因爲你還通過IO循環註冊了其他事件,並通過相同的設計界面調用它們 – pyfunc
讓我深入挖掘我的問題的性能部分 - 是真的,while循環 - 輪詢構造豬多CPU和IOloop更少CPU密集? – crashekar