ZeroMQ Poller vs Tornados EventLoop

时间:2012-06-25 15:36:58

标签: python tornado zeromq event-loop poller

设计明智且性能明智哪种方法建议用于处理多个Zeromq套接字以及为什么?

ZeroMQ使用的Tornado的IOLoop是否真的比使用while循环中的Poller处理多个套接字的CPU少?

2 个答案:

答案 0 :(得分:3)

如果你将自己的观察/分析添加到你的问题中,那就太好了。

我认为性能没有任何差异,但设计存在差异。

如果是poller

您注册要轮询的套接字,然后使用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 ....

如果是eventloop 但是,当您处理多个套接字时,使用事件循环非常优雅,因为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()

我希望澄清你的问题。

答案 1 :(得分:1)

由PyZMQ重新实现的Tornado IO Loop无论如何都会在幕后使用轮询器,因此不太可能使用比另一个更多的CPU。

有关详细信息,请参阅https://github.com/zeromq/pyzmq/blob/master/zmq/eventloop/ioloop.py