设计明智且性能明智哪种方法推荐用于处理多个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