У меня есть проект, который будет работать в сети и хотел бы обернуть базовую реализацию запросов Boost Beast HTTP (S) внутри фьючерсов.
Я скопировал класс session
из https://www.boost.org/doc/libs/1_69_0/libs/beast/example/http/client/async-ssl/http_client_async_ssl.cpp ихотите изменить session::run()
тип возврата на std::future<http::response<http::string_body>>
.Кроме того, измените место // Write the message to standard out
на настройку результата в обещании вместо печати.
Вопросы:
- , куда поместить обещание, которое будет использоваться для созданиябудущее?Является ли ученик правильным выбором?
- где поставить
boost::asio::io_context ioc
?Должно ли оно быть в цикле ядра моего собственного приложения (при условии, что приложение будет запускать несколько запросов в течение своего срока службы), а затем передавать ссылку на ioc
при выполнении запросов? А как насчет ioc.run()
?- Мне нужно, чтобы он работал постоянно, я должен открыть специальный поток для запуска ioc
, чтобы избежать блокировки? - Как обрабатывать
session
ошибки?Я хотел бы использовать интерфейс std::promise
и поместить исключение на случай, если что-то пойдет не так - в основном замените все вызовы на fail()
в примере с соответствующими исключениями.Но я не могу просто поместить объект исключения в обещание, он ожидает std::exception_ptr
- я должен просто бросить, немедленно поймать его и поставить std::current_exception()
?Мне кажется, что это плохой взлом. - Будет ли это работать, если я не создаю какие-либо темы в программе?Если нет, какой будет хороший способ запросить у объекта
session
, что все задачи выполнены?
Редактировать: добавлен еще вопрос о ioc
(выделено жирным шрифтом)