【问题标题】:About ZeroMQ and polling on non-blocking sockets :关于 ZeroMQ 和轮询非阻塞套接字:
【发布时间】:2018-09-20 07:44:13
【问题描述】:

在 Linux 中,如果应用程序使用原始非阻塞套接字进行读取,结合轮询,是否可以在套接字有一些数据可供读取时得到通知?

我试图深入研究 ZeroMQ 文档,但找不到方法。

我找到了 ZMQ_NOBLOCK 标志,但是在调用 zmq_recv 时会应用它。

有没有办法将套接字本身设置为非阻塞,以便在没有可读取的内容时轮询可以立即返回?

我使用 C++ 作为我的应用程序的语言。

【问题讨论】:

    标签: c++ sockets zeromq distributed-computing polling


    【解决方案1】:

    嗯,这里有几个漏点:

    首先,ZeroMQ-Socket-instance 与 O/S 套接字不同。对于主要的歧义,请随时阅读有关概念差异的帖子。

    这是一个经常被重新表述的误解,所以让我用粗体重复一遍。

    注意: ZeroMQ Socket()-instance 不是 tcp-socket-as-you-know-it。最好了解 [ZeroMQ hierarchy in less than a five seconds] 或 other posts and discussions here 中的主要概念差异


    ZMQ_NOBLOCK 符号可以用在更多地方:

    zmq_recv() 就是这样一个,zmq_send() 是另一个。

    这个符号在头文件中主要是#define-ed,但在某个地方还有一些其他值相同的别名,zmq.DONTWAIT就是这样一个flag-python-wrappers/bindings 的组合相关符号。


    Socket-实例没有(非)阻塞这样的属性:

    这是您迄今为止发布的问题中的核心主要问题。

    Socket-instance 本身不保留任何此类功能。

    各个(单独的)实例操作 - 对 { .recv() | .send() } 方法的调用可以使用基于参数的机制来更改其每次调用的操作方式:
    @ 987654334@ 但没有这样的选项来“打开”-任何这样的模式打开/关闭以持续存在。


    问:“有没有办法将套接字本身设置为非阻塞”?
    答:没有。


    问:“有没有办法将Poller.poll() 设置为立即返回”?
    答:可以!

    int zmq_poll ( zmq_pollitem_t *items, int nitems, long timeout );

    所以,
    除非有人调用 zmq_poll( ..., -1 ),这会使轮询挂起无限长,zmq_poll()-call 最晚返回timeout [ms],所以使用@987654343 @,zmq_poll()-call 立即返回,不管有没有找到物品,太好了,不是吗?

    【讨论】:

      猜你喜欢
      • 2010-10-31
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      相关资源
      最近更新 更多