当在单线程异步系统中发出多个同时请求时,beast boost async http客户端如何在c++11中工作?
用例:
我想同时发送多个异步请求,并为每个请求创建新的 http 客户端。当收到任何请求的响应时,我将调用一个回调函数,该函数会在收到响应 1 秒后删除客户端,以避免任何内存泄漏。但是,即使我为每个请求创建了一个新的客户端对象,系统/代码似乎也会在一些随机数量的同时 http 请求之后挂起。野兽加速是否使用了一些共享资源,因为这种暂停看起来像系统处于无限死锁状态。PS:我也尝试评论这个删除块,但系统的行为也是一样的。
以下是 boost 和编译器版本的规格:
提升:稳定 1.68.0
BOOST_BEAST_VERSION 181
clang -v
clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
void sendHttpRequest(){
HttpClient *client = new HttpClient();
deleteClient = [this,client]{
int timeout = 1;
boost::asio::deadline_timer *clientDeleteTimer = new boost::asio::deadline_timer( *this->context);
clientDeleteTimer->expires_from_now(boost::posix_time::seconds(timeout));
clientDeleteTimer->async_wait([client,this,clientDeleteTimer](const boost::system::error_code &ec){
if(ec == boost::asio::error::operation_aborted){
std::cout<<" Operation aborted\n"<<std::flush;
return;
}
else{
delete client;
}
delete clientDeleteTimer;
};
callback = [] {
std::cout<<"Response recieved successfully\n"<<std::flush;
deleteClient();
};
errback = [] {
std::cout<<"Response not recieved \n"<<std::flush;
deleteClient();
};
client.sendPostRequest(request, callback , errback);
}
上面的这个函数是一个包装函数,它将为每个请求调用,并且在内部将创建新的 http 异步客户端并在收到响应/错误 1 秒后删除该客户端对象(基本上请求已被处理)。