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

时间:2016-01-18 08:11:21

标签: network-programming zeromq nonblocking

似乎有两种主要方法可以在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_recv ZMQ_NOBLOCK的版本?

1 个答案:

答案 0 :(得分:2)

如果不使用zmq_recv(&msg, ZMQ_NOBLOCK)

,您很少会zmq_poll

通常你会在循环中阅读;

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

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

如果你只有一个套接字,并且不想使用zmq_poll,你通常会使用阻塞zmq_recv,并设置一个ZMQ_RCVTIMEO,这样你就不会在发送时出现问题而永久阻止侧。