发送多个同时请求时,单线程异步系统中野兽增强异步 http 客户端的行为

Posted

技术标签:

【中文标题】发送多个同时请求时,单线程异步系统中野兽增强异步 http 客户端的行为【英文标题】:Behaviour of beast boost Async http client in single threaded asynchronous system when multiple simultaneous requests are sent 【发布时间】:2019-03-15 06:22:02 【问题描述】:

当在单线程异步系统中同时发出多个请求时,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 ​​秒后删除该客户端对象(基本上请求已被处理)。

【问题讨论】:

您能分享一些您的源代码以供参考吗? 【参考方案1】:

访问https://github.com/boostorg/beast/issues/1458。这个问题也解决了同样的问题。但我想它仍然没有解决。

【讨论】:

以上是关于发送多个同时请求时,单线程异步系统中野兽增强异步 http 客户端的行为的主要内容,如果未能解决你的问题,请参考以下文章

node 简介

随手记一 2018/04/23 Ajax基础了解

同步与异步的区别

详解Ajax请求——多个异步请求的执行顺序

java异步线程池同时请求多个接口数据

你了解异步编程进程单线程多线程吗?