【问题标题】:boost::asio how spawn multiple coroutine, and then join them?boost::asio 如何生成多个协程,然后加入它们?
【发布时间】:2020-06-07 17:13:15
【问题描述】:

我正在使用 boost::asio,我的代码是这样的:

void my_coroutine(boost::asio::io_context& io, boost::asio::yield_context yield)
{
        boost::asio::spawn(io, other_1_coroutine);
        boost::asio::spawn(io, other_2_coroutine);
        async_wait(other_1 and other_2);
        continue_do_something();
}

我想同时生成 2 个或更多协程,然后异步等待它们。 我试过协程 TS,但 g++ 还不支持。 我怎样才能做到这一点?

【问题讨论】:

    标签: c++ join yield coroutine asio


    【解决方案1】:

    当您调用spawn 函数时,您将作为第一个参数传递执行上下文(作为io_context 类的实例)。在这个对象内部,严格在io_context::run 方法内部执行协程函数。

    所有你需要等到协程完成,就是在io_context上调用run——前提是你没有使用这个io对象来启动其他一些异步任务(所以你应该创建专用的io_context协程的实例)。

    如果要处理多个协程,则必须调用后台线程runmetod。

    boost::asio::spawn(io, other_1_coroutine);
    boost::asio::spawn(io, other_2_coroutine);
    
    // join section:
    std::thread th( [&](){ io.run(); } );
    io.run();
    th.join();
    
    continue_do_something();
    

    在上面的代码中,我们创建了一个调用run 的线程。所以run 的两个调用同时工作并执行两个启动的协程。

    Demo(与您的代码不是 1:1,但它展示了如何加入协程)。

    【讨论】:

    • 我想异步运行我的程序的所有部分,没有阻塞,没有线程睡眠/线程连接。 “组合异步操作”/asio::async_initiate() 是正确的方式吗?
    • 我不明白。在标题中你正在写关于“加入”的问题,你说“然后异步等待他们所有人”。在spawn启动协程后,将run放到后台线程中,可以并行执行其他代码,这不是你想要的吗?
    • 对不起“join”这个词,我想要 async await 所有生成的协程,它应该是“like join”,也像 python3:asyncio.wait(aws, *, loop=None,超时=无,return_when=ALL_COMPLETED)
    猜你喜欢
    • 2015-04-22
    • 2014-08-03
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多