Поведение Beast Boost Async http-клиента в однопоточной асинхронной системе при отправке нескольких одновременных запросов - PullRequest
0 голосов
/ 15 марта 2019

Как работает асинхронный http-клиент beast boost в c ++ 11 , когда в однопоточной асинхронной системе выполняется несколько одновременных запросов?

ИСПОЛЬЗОВАНИЕ:

Я хочу отправить несколько одновременных асинхронных запросов , и я создаю новый http-клиент для каждого запроса . Когда ответ на любой запрос получен, я вызываю функцию обратного вызова, которая удаляет клиента через 1 секунду после получения ответа , чтобы избежать утечек памяти. Но похоже, что система / код зависает после некоторого случайного числа одновременных http-запросов, хотя я создаю новый клиентский объект для каждого запроса. Использует ли Beast Boost какой-либо общий ресурс, поскольку эта пауза выглядит так, как будто система находится в бесконечном тупике. PS: Я также пытался комментировать этот блок удаления, но затем система также ведет себя так же.

Ниже приведены спецификации для надстройки и версии компилятора:

  • повышение: стабильное 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 голосов
/ 15 марта 2019

Посетите https://github.com/boostorg/beast/issues/1458. Эта проблема также решает ту же проблему.Но я думаю, что все еще не решена.

...