对一个套接字使用 zmq_recv 和 ZMQ_NOBLOCK 与 zmq_poll

Using zmq_recv and ZMQ_NOBLOCK versus zmq_poll for one socket

在 ZeroMQ 中似乎有两种主要的方法可以从您的套接字中异步获取数据:

if(zmq_recv(&msg, ZMQ_NOBLOCK) == 0) { // could return EAGAIN or others
    // do stuff
}

...and...

if(zmq_poll(&pollItems[0], num, timeout)) {
    if(zmq_poll(&msg) == 0) {
        // do stuff
    }
}

如果我只有一个要读取的套接字,是否有令人信服的理由让我选择使用 zmq_poll 而不是 zmq_recvZMQ_NOBLOCK 的版本?

如果不使用 zmq_poll

,您很少会做 zmq_recv(&msg, ZMQ_NOBLOCK)

通常你会循环阅读;

while (!done) {
...
  zmq_recv(&msg, ZMQ_NOBLOCK);
... 
}

这是一个繁忙的等待,它不必要地使用了 CPU。 zmq_poll() 块,并且在等待某事发生时不要消耗 CPU。

如果您只有一个套接字,并且不想使用 zmq_poll,您通常会使用阻塞 zmq_recv,并设置一个 ZMQ_RCVTIMEO 这样您就不会如果发送方出现问题,将永远阻止。