【问题标题】:Listening for POLLIN on an fd in gevent在 gevent 的 fd 上监听 POLLIN
【发布时间】:2011-11-03 03:38:26
【问题描述】:

我想将 ZeroMQ 连接到 gevent 循环。使用 ZeroMQ API,我可以获取套接字的 fd。如何在不阻塞其他 greenlet 的情况下在 greenlet 中查看此套接字的 POLLIN 事件?

【问题讨论】:

    标签: zeromq gevent


    【解决方案1】:
    # for gevent >= 1.0
    hub = gevent.get_hub()
    watcher = hub.loop.io(fd, 1)  # 1 = READ, 2 = WRITE, 3 = READ|WRITE
    hub.wait(watcher)
    # fd is now ready for reading
    

    但是,最好弄清楚如何为此使用 gevent-zeromq 或扩展它以支持您的用例。

    【讨论】:

      【解决方案2】:

      这是来自 ZeroMQ 的示例。请求-回复经纪人http://zguide.zeromq.org/py:rrbroker 它监听 POLLIN 事件,使用 gevent-zeromq 不会阻塞其他线程。

      这是你要找的吗?

      【讨论】:

        【解决方案3】:

        查看 github/pypi 上的 gevent-zeromq

        【讨论】:

        • 是的,检查过了,感谢您的创作!不幸的是,它不符合我的利基需求。我可能一次有大量客户端连接到我的 XREP 套接字,其中许多可能会长时间阻塞。因此,我不能使用连接 N 个工作套接字的正常 zmq 方法,因为它无法扩展。我的解决方法是在 XREP 套接字上侦听 POLLIN,接收消息,并在新的 greenlet 中处理它。单个greenlet 同步对套接字的读/写。 AFAIK,我不能在 gevent-zeromq 中做这样的事情。
        • 当然,只有一个 greenlet 处理套接字通信并在新消息上产生(并且可能使用队列来进行绿色间通信)。
        • 单个 greenlet 必须同时处理套接字上的发送和接收消息,因为我认为您不能在 zmq 中同时处理这两者。我不能只在循环中使用 recv() ,因为它会在有可能要发送的消息时阻塞。只有当它知道有可读消息时才需要recv()。
        猜你喜欢
        • 1970-01-01
        • 2011-09-16
        • 1970-01-01
        • 2011-09-15
        • 1970-01-01
        • 1970-01-01
        • 2011-07-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多