@HamsterGamer

В чем причина долгого исполнения моего асинхронного HTTP клиента?

Всем привет, необходимо реализовать асинхронный HTTP клиентик, который имея список url'ов трекеров должен вернуть первый полученный HTTP response от любого первого ответившего. Немного переписав пример из оф доки - https://www.boost.org/doc/libs/1_76_0/doc/html/boo... и добавив туда работу с boost::future/boost::promise я написал следующий код:
https://pastebin.com/hAG2k3rd
Изменения внесенные в пример: в структуре client теперь имеется promise, у клиентского кода же есть future от него, и он, используя бустовую функцию when_any пытается получить самый быстрый и валидный фьючерс. When_any вернет вектор фьючерсов, где первый будет гарантированно готов к обработке, внутри обработчика я проверяю результат фьючерса на исключение и если оно есть, то запускаю процедуру заново, но уже с частью фьючерсов которые еще не были обработаны.

В целом он вроде как даже работает, но почему-то тормозит (именно вся программа, то есть поток main'a и поток где выполняется io_service::run застывают) на строчке под номером 228 "result.set_value(any_res->get());", и я не понимаю в чем причина такого поведения, прошу помочь разобраться! Заранее благодарю!
  • Вопрос задан
  • 116 просмотров
Решения вопроса 1
@HamsterGamer Автор вопроса
Вроде как я разобрался, в литературе Энтони Уильямса when_any (из experimental std) работает ровно как я описал выше, то есть когда будет готов хотя бы 1 фьючерс он вернет вектор фьючерсов в отсортированном виде так, чтобы сначала шли готовые (то есть begin должен быть 100% is_ready), в бустовой же версии готовый фьючерс будет лежать на своем месте, а не в начале.
И доставать его нужно как-то так:
...(boost::future<std::vector<boost::future<std::string>>> result_args) {
                auto results = result_args.get();
                auto any_res = results.begin();
                for (; any_res != results.end(); any_res++){
                    if (any_res->is_ready())
                        break;
                }
...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы