如何产生一个等待异步操作的线程?

时间:2017-01-12 15:19:48

标签: c++ asynchronous networking boost-asio

这是我的网络场景:服务器(使用boost asio实现)正在接收请求,处理它们,然后传递给多个主机(使用http客户端也使用asio实现),等待答案,处理答案,然后回复原始请求。

问题是主机被授予时间限制,服务器必须在等待答案时尊重它(即如果限制是100ms,那么服务器在100ms通过之前就不能关闭连接)。

由于我的服务器正在使用工作线程池(每个线程正在运行boost::asio::io_service::run()),如果主机阻塞等待答案很快就会成为瓶颈(即所有工作人员都在忙着等待,不能再提供请求了)。

此处的服务器处理程序代码(主要是跳过)

void connection::handle(asio::yield_context yield)
{
    // read request
    asio::async_read_until(socket_, request_buf, "\r\n", yield);

    // read headers
    asio::async_read_until(socket_, request_buf, "\r\n\r\n", yield);

    // handle request
    // THIS IS BLOCKING CALL
    request_handler_->handle_request(request_, reply_);

    // write reply
    asio::async_write(socket_, reply_.to_buffers(), yield[ec]);
}

这就是handle_request所做的事情

http::client::client c(host, port);

// this is asynchronous call returning immediately
std::future<http::reply> res = c.send(request);

// BOTTLENECK PROBLEM HERE
// this is blocking wait for answer
auto reply = res->get();

首先,我可以用异步方式重写handle_request(),如下所示:https://stackoverflow.com/a/26728121(这不会解决问题,但可以更有用)。我也可以将回调传递给client::send()以避免明确获得回复。

我想以某种方式&#34;收益&#34;阻止等待直到收到所有响应,因此工作人员可以在此期间免费提供其他传入请求。

我尝试了boost::coroutineboost::fiber,但没有成功,确实这两个只是传递执行上下文,但我没有地方传递上下文,我只需要等待&#34;等待&# 34。

0 个答案:

没有答案