结合Boost Future使用Boost协程:生成协程结果Map与Asio任务
实现基于Boost.Asio协程的任务生成与结果存储
我来帮你把现有代码改成适配Boost.Asio协程的版本,同时实现用std::map存储每个协程任务的执行结果——咱们一步步来梳理:
第一步:调整函数为Asio协程兼容形式
首先得把create_tasks改成返回asio::awaitable<std::map<std::string, boost::shared_ptr<HTTPResponse>>>,这样它才能被Asio的协程调度器识别。另外,函数需要能访问Asio的io_context(或执行器),这是异步操作的核心依赖。
第二步:生成异步任务并收集结果
假设你需要基于夏令时调整后的start值发起多个HTTP请求,咱们可以把每个请求包装成异步协程任务,要么逐个执行要么并发运行,最后把结果存入map。
下面是修改后的完整代码示例:
#include <boost/asio.hpp> #include <boost/asio/awaitable.hpp> #include <boost/asio/co_spawn.hpp> #include <boost/asio/detached.hpp> #include <boost/shared_ptr.hpp> #include <map> #include <sstream> #include <string> // 假设HTTPResponse类已定义,这里先模拟异步HTTP请求的协程函数 asio::awaitable<boost::shared_ptr<HTTPResponse>> async_http_get(const std::string& url) { boost::shared_ptr<HTTPResponse> response = boost::make_shared<HTTPResponse>(); // 模拟异步等待(实际场景替换为Boost.Beast等HTTP库的异步请求逻辑) co_await asio::steady_timer(co_await asio::this_coro::executor, std::chrono::seconds(1)).async_wait(asio::use_awaitable); // 这里可以填充response的实际数据 co_return response; } asio::awaitable<std::map<std::string, boost::shared_ptr<HTTPResponse>>> create_tasks( const symbols_enum& symbol, date day, boost::asio::io_context& io_context) { int start = 0; if (is_dst(day)) { start = 1; } std::ostringstream oss; oss << symbol; std::string url_currency = oss.str(); std::map<std::string, boost::shared_ptr<HTTPResponse>> task_results; // 示例:生成3个基于start值的任务 for (int i = start; i < start + 3; ++i) { std::ostringstream task_url_oss; task_url_oss << url_currency << "/data?day=" << day << "&hour=" << i; std::string task_url = task_url_oss.str(); // 等待异步请求完成,把结果存入map auto resp = co_await async_http_get(task_url); task_results[task_url] = resp; } // 如果需要并发执行多个任务,用asio::when_all更高效: // auto [resp1, resp2, resp3] = co_await asio::when_all( // async_http_get(url1), // async_http_get(url2), // async_http_get(url3) // ); // task_results[url1] = resp1; // task_results[url2] = resp2; // task_results[url3] = resp3; co_return task_results; } // 启动协程的示例代码 void run_task_collection(boost::asio::io_context& io_context, const symbols_enum& symbol, date day) { boost::asio::co_spawn( io_context, [&]() -> asio::awaitable<void> { auto results = co_await create_tasks(symbol, day, io_context); // 这里可以处理结果map,比如遍历打印、持久化等 for (const auto& [task_key, resp] : results) { // 处理每个响应的逻辑 } }, boost::asio::detached ); }
关键细节说明
- 协程标识:用
asio::awaitable<T>标记协程函数,让Asio能正确调度异步流程。 - 结果存储:以任务的唯一标识(比如请求URL)作为map的键,
HTTPResponse智能指针作为值,方便后续查找和管理。 - 并发优化:如果任务之间没有依赖,用
asio::when_all可以同时启动多个异步任务,大幅提升执行效率。 - 协程启动:通过
co_spawn把协程提交给io_context调度,detached参数让协程在后台运行(也可以自定义完成回调)。
这样你就得到了可直接用于Asio的协程任务,同时能把所有任务的执行结果统一存储到map中了。
内容的提问来源于stack exchange,提问作者ahmed allam
相关产品推荐
相关产品推荐

