【问题标题】:ZeroMQ Poller vs Tornados EventLoopZeroMQ Poller vs Tornados EventLoop
【发布时间】:2012-06-25 15:36:57
【问题描述】:

在设计和性能方面推荐哪种方法来处理多个 Zeromq 套接字?为什么?

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

【问题讨论】:

    标签: python tornado zeromq event-loop poller


    【解决方案1】:

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

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

    在轮询的情况下

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

    我希望能澄清你的问题。

    【讨论】:

    • 感谢您的回复。从您的回答中可以明显看出,使用事件循环可能是有意义的,因为回调系统使代码更具可读性。我不确定哪个更有效 - 由于事件循环使用龙卷风 IOLoop 它是否也让事情变得更快?
    • @crashekar :不,我认为它不会提高性能,但正如我在回答中建议的那样,当您编写更复杂的信息时,它会更优雅。您的循环由 Tornado IO 循环处理,它进行选择并调用您的回调。在更复杂的项目中,这很优雅,因为您还可以使用 IO 循环注册其他事件并通过相同的设计接口调用它们
    • 让我更深入地研究我的问题的性能部分 - while 循环 - 轮询器构造占用更多 CPU 和 IOloop 占用更多 CPU 资源是真的吗?
    • @crashekar:轮询应该是非忙等待。等待套接字时不应使用任何 cpu。您是否遇到过任何明显的性能问题?
    【解决方案2】:

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

    详情请见https://github.com/zeromq/pyzmq/blob/master/zmq/eventloop/ioloop.py

    【讨论】:

      猜你喜欢
      • 2021-03-27
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 2012-08-19
      • 2016-12-31
      • 1970-01-01
      相关资源
      最近更新 更多