在处理多个Zeromq套接字时,从设计和性能方面考虑,哪种方法是推荐的?为什么?
Tornado使用的IOLoop比while循环中使用的Poller来处理多个套接字更节省CPU,这是真的吗?
在处理多个Zeromq套接字时,从设计和性能方面考虑,哪种方法是推荐的?为什么?
Tornado使用的IOLoop比while循环中使用的Poller来处理多个套接字更节省CPU,这是真的吗?
如果您在问题中添加自己的观察/分析,那将会很好。
我认为性能上没有任何区别,但设计上有所不同。
在轮询器的情况下
您注册要轮询的套接字,然后使用 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()
希望这样能澄清你的问题。
详见https://github.com/zeromq/pyzmq/blob/master/zmq/eventloop/ioloop.py。