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
相关产品推荐
相关产品推荐

