You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

结合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:56:15