5

设计明智和性能明智,建议使用哪种方法来处理多个 Zeromq 套接字,为什么?

ZeroMQ 使用的 Tornado 的 IOLoop 占用的 CPU 是否比 while 循环中用于处理多个套接字的轮询器占用的 CPU 少?

4

2 回答 2

4

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

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

在轮询的情况下

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

我希望这能澄清你的问题。

于 2012-06-25T15:51:14.107 回答
1

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

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

于 2012-06-26T12:00:47.980 回答