[英]About ZeroMQ and polling on non-blocking sockets :
在 Linux 中,如果应用程序使用原始非阻塞套接字进行读取,结合轮询,是否可以在套接字有一些数据可供读取时得到通知?
我试图深入研究 ZeroMQ 文档,但我找不到我的方法。
我找到了标志ZMQ_NOBLOCK
,但它在调用zmq_recv
时被zmq_recv
。
有没有办法将套接字本身设置为非阻塞,以便在没有任何内容时轮询可以立即返回?
我使用 C++ 作为我的应用程序的语言。
首先,ZeroMQ- Socket
实例与 O/S 套接字完全不同。 对于主要消歧,请随时阅读有关概念差异的帖子。
这是一个经常被重新阐明的误解,所以让我用粗体重复一遍。
注意: ZeroMQ Socket()
-instance不是tcp-socket-as-you-know-it。 关于[主要概念分歧最好看的ZeroMQ层次不到5秒]或其他职位,并在这里讨论
ZMQ_NOBLOCK
符号可以用在更多地方: zmq_recv()
是一个, zmq_send()
是另一个。
这个符号在头文件中主要是#define
-ed,但在某处也有一些其他值相同的别名,一个zmq.DONTWAIT
是 python-wrappers/bindings 的一个这样的flag
相关符号。
Socket
实例没有 (not-) 阻塞这样的属性:这是您迄今为止发布的问题中的核心主要失误。
Socket
实例本身不保留任何此类功能。
相应的(单独的)实例操作 - 调用{ .recv() | .send() }
{ .recv() | .send() }
-method 可以使用基于参数的机制来更改其每次调用的操作方式:
flags = { 0, ZMQ_DONTWAIT, ZMQ_SENDMORE, ZMQ_DONTWAIT && ZMQ_SENDMORE }
但没有这样的选项来“打开”/关闭任何此类模式以保持flags = { 0, ZMQ_DONTWAIT, ZMQ_SENDMORE, ZMQ_DONTWAIT && ZMQ_SENDMORE }
。
Poller.poll()
立即返回”?
int zmq_poll ( zmq_pollitem_t *items, int nitems,
long timeout
);
所以,
除非调用zmq_poll( ..., -1 )
,这会使轮询无限期挂起, zmq_poll()
调用最晚返回timeout
[ms]
,因此使用timeout == 0
, zmq_poll()
调用返回马上,不管有没有发现任何物品,那太好了,不是吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.