我有一个通过UDP接收数据的服务,我想添加一些zmq订户。我也想使用zmq套接字而不阻塞。而且我不想为此创建单独的线程。
我可以使用zmq_socket::receive(msg, ZMQ_DONTWAIT)
,但这会导致繁忙的循环和100%的CPU利用率。我从1.58开始尝试boost::coroutines
,但是没有成功-我无法隐藏阻止接收(套接字RCVTIMEO
设置为-1)。
我认为我缺少了一些东西,只是使用了不正确的工具。 那么问题是隐藏阻止接收的正确方法是什么?
答案 0 :(得分:0)
我不确定您使用的是哪个zeromq包装器库,因此这里是基于核心libzmq库的示例。
使用documentation可以定义超时并仍然进行阻塞读取。
// 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
}
或者,如果您只想收到有关回调的通知,则可以使用