2016-01-18 4 views
1

Там, кажется, два основных способа асинхронно получить данные с розеткой в ​​ZeroMQ:Использование zmq_recv и ZMQ_NOBLOCK против zmq_poll для одной розетки

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?

ответ

2

Вы редко делаете zmq_recv(&msg, ZMQ_NOBLOCK) без использования zmq_poll

Обычно вы читали в цикле;

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

Это занятое ожидание, оно использует CPU без необходимости. zmq_poll() блокирует и не потребляет процессор, пока он ждет чего-то.

Если у вас только один сокет и вы не хотите использовать zmq_poll, вы обычно используете блокировку zmq_recv и устанавливаете ZMQ_RCVTIMEO, чтобы вы не блокировали навсегда, если что-то пошло на сторону отправки.

Смежные вопросы