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

C++20 cppcoro中Python asyncio.create_task等效实现问询

问题

我正尝试将一段使用协程的Python代码改写为基于C20与cppcoro库的实现,但无法找到与Python中asyncio.create_task(可立即并发运行任务)功能等效的C函数。另外想咨询cppcoro是否有类似Python中await asyncio.sleep的休眠函数,或者有没有更合适的协程库推荐。

Python示例代码如下:

#!/usr/bin/env python3

import asyncio
import time

async def getter():
    for i in range(0,10):
        print("ok")
        await asyncio.sleep(0.1)
    return 100


async def runner():
    n = asyncio.create_task(getter()) # getter started immediately
    await asyncio.sleep(0.2) # let's do something else while getter is running
    print("running") # print some text while getter is still running

    nn = await n  # wait for getter and get result
    print(nn)


asyncio.run(runner())
解答

1. cppcoro中对应asyncio.create_task的功能

cppcoro没有和asyncio.create_task完全一致的直接函数,但可以通过任务调度实现等效的立即并发效果:

  • cppcoro的task<T>对象不会自动执行,需提交到调度器启动。
  • 可结合cppcoro::io_scheduler调度器提交任务,或用cppcoro::detach让任务在后台异步运行,实现类似create_task的立即并发。

对应Python示例的cppcoro实现代码:

#include <cppcoro/cppcoro.hpp>
#include <cppcoro/sleep_for.hpp>
#include <cppcoro/io_scheduler.hpp>
#include <iostream>
#include <chrono>

cppcoro::task<int> getter()
{
    for (int i = 0; i < 10; ++i)
    {
        std::cout << "ok\n";
        co_await cppcoro::sleep_for(std::chrono::milliseconds(100));
    }
    co_return 100;
}

cppcoro::task<> runner(cppcoro::io_scheduler& scheduler)
{
    // 提交getter到调度器,立即启动并发运行
    auto n = scheduler.schedule(getter());
    
    co_await cppcoro::sleep_for(std::chrono::milliseconds(200));
    std::cout << "running\n";
    
    // 等待任务完成并获取结果
    int nn = co_await n;
    std::cout << nn << '\n';
}

int main()
{
    cppcoro::io_scheduler scheduler;
    scheduler.schedule(runner(scheduler)).resume();
    scheduler.run();
}

若无需IO调度,也可直接用detach启动后台任务:

// 在runner函数内:
auto task = getter();
cppcoro::detach(std::move(task)); // 立即启动任务,后台运行

2. cppcoro中的休眠函数

cppcoro提供了cppcoro::sleep_for和cppcoro::sleep_until,完全对应Python的asyncio.sleep:

  • cppcoro::sleep_for:休眠指定时长,需包含头文件<cppcoro/sleep_for.hpp>
  • cppcoro::sleep_until:休眠到指定时间点,需包含头文件<cppcoro/sleep_until.hpp>

用法示例:

// 休眠100毫秒
co_await cppcoro::sleep_for(std::chrono::milliseconds(100));

3. 替代协程库推荐

如果cppcoro不符合需求,可考虑以下主流协程库:

  • Boost.Asio:支持C++20协程,生态成熟,提供丰富IO操作与任务调度能力,属于工业级选择。
  • libunifex:由C标准委员会成员主导开发,是未来C标准库协程框架的参考实现,接口设计贴近标准。
  • Folly Coroutines:Facebook开源基础库中的协程模块,性能优异,适合大规模高性能场景。

内容的提问来源于stack exchange,提问作者T0maas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:12:03