【问题标题】:How to integrate a ZeroMQ socket into a glib main loop?如何将 ZeroMQ 套接字集成到 glib 主循环中?
【发布时间】:2011-07-14 15:34:12
【问题描述】:

我想将 ZeroMQ 套接字添加到 glib 程序。

遗憾的是,zmq 套接字不是poll()-able,他们给出了他们的实现,它重载了旧的poll() func。我怎样才能有效地将它集成到主循环中?我尝试使用他们的投票 (zmq_poll()) 而不是默认的投票,但是除了将其设为 global 之外,没有给它提供 zmq 套接字的好方法。

定义一个新的GSource 有效,但它可能会获得高CPU 使用率(通过设置timeout = 0)或任意轮询超时(例如将timeout = 100 设置为至少每100 毫秒轮询一次),这并不是很有效,因为有轮询的可能性。

【问题讨论】:

    标签: c linux glib zeromq


    【解决方案1】:

    根据FAQ,您可以尝试“另一种方式”的方法。与其在 zmq 套接字 上创建 poll,不如在常规 套接字 上尝试 zmq_poll()

    查看问题如何将 ØMQ 套接字与普通套接字集成?还是使用 GUI 事件循环?在常见问题解答中。

    【讨论】:

    • 感谢您指向常见问题解答。这是一个选项,正如我在我的问题中所说,但令人讨厌的是 glib 想要一个 poll() 函数指针,他们只是给了一组 fds。添加 zmq 套接字必须通过使它们成为全局来侧载它们。
    【解决方案2】:

    我发现较新的 zmq 库支持 ZMQ_FD getsockopt() 参数,它会返回一个 unix fd,您可以使用 poll()。唯一需要注意的是,您不能只 poll() 它知道您是否可以从/到它 recv()send(),但您需要使用 ZMQ_EVENTS getsockopt()参数以获取真正的fd 状态。

    它似乎在 glib 中运行得很好。

    【讨论】:

    • 因为 zmq 以不明显的方式使用套接字,所以一个简单的轮询只是告诉你套接字上有活动,但要知道真正的 zmq 套接字状态你需要另一层间接
    • 看起来您在这里找到了两个合适的答案:使用ZMQ_FD,或编写自定义GSource。自定义 GSource 不一定需要在高 CPU 使用率和任意超时之间做出决定:听起来您的自定义 GSource 中的 prepare()check() 实现会虚假地返回 TRUE
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 2022-06-15
    相关资源
    最近更新 更多