对一个套接字使用 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_recv
和 ZMQ_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 这样您就不会如果发送方出现问题,将永远阻止。
在 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
的版本?
如果不使用 zmq_poll
zmq_recv(&msg, ZMQ_NOBLOCK)
通常你会循环阅读;
while (!done) {
...
zmq_recv(&msg, ZMQ_NOBLOCK);
...
}
这是一个繁忙的等待,它不必要地使用了 CPU。 zmq_poll()
块,并且在等待某事发生时不要消耗 CPU。
如果您只有一个套接字,并且不想使用 zmq_poll,您通常会使用阻塞 zmq_recv
,并设置一个 ZMQ_RCVTIMEO 这样您就不会如果发送方出现问题,将永远阻止。