发送多个同时请求时,beast boost异步http客户端在单线程异步系统中的行为

时间:2019-03-15 06:22:03

标签: c++ http boost single-threaded beast

在单个线程异步系统中同时发出多个请求时,野兽增强异步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秒的响应/错误(基本上已处理了请求)后删除该客户端对象。

1 个答案:

答案 0 :(得分:0)

访问https://github.com/boostorg/beast/issues/1458。此问题也解决了同一问题。但是我想它仍然没有解决。