Скрыть блокировку с сопрограммой - PullRequest
4 голосов
/ 24 апреля 2019

У меня есть сервис, который получает данные через UDP, и я хотел бы добавить несколько подписчиков zmq.Я также хочу использовать сокеты zmq без блокировки.И я не хочу создавать отдельный поток для него.

Я мог бы использовать zmq_socket::receive(msg, ZMQ_DONTWAIT), но это приводит к циклу занятости и 100% -ной загрузке ЦП.Я попытался boost::coroutines из 1.58, но безуспешно - я не смог скрыть блокировку приема (сокет RCVTIMEO был установлен в -1).

Я верю, что я 'Я что-то упускаю и просто неправильно использую инструменты.Итак, вопрос в том, как правильно скрыть блокировку получения?

1 Ответ

0 голосов
/ 24 апреля 2019

Я не уверен, какую библиотеку оболочки zeromq вы используете, поэтому вот пример, основанный на ядре libzmq lib.

Используйте zmq_poll , чтобы вы могли определить тайм-аут и по-прежнему выполнять блокирующее чтение.

// define one socket (could define multiple), set event on ZMQ_POLLIN.
zmq_pollitem_t items[] = {{socket1, 0, ZMQ_POLLIN, 0}};

while(1)
{
  // here you are polling the socket(s) defined in items with a timeout of 10ms
  int rc = zmq_poll(items, 1, 10);

  // Check which item (socket) had the event
  if(items[0].revents & ZMQ_POLLIN)
  {
    // There is data available on socket1
    // So call recv here on socket1

  } 

  // do other stuff here
}

В качестве альтернативы, если вы хотите получать уведомления только о обратных вызовах, вы можете использовать

...