这是我的网络场景:服务器(使用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::coroutine
和boost::fiber
,但没有成功,确实这两个只是传递执行上下文,但我没有地方传递上下文,我只需要等待&#34;等待&# 34。