渡劫 C++ 协程(9):一个简单的示例
截止目前,我们一直专注于构建基于协程 API 的框架支持,这次我们用这些框架来写个简单的示例,并以此来结束整个系列的内容。
- 渡劫 C++ 协程(0):前言
- 渡劫 C++ 协程(1):C++ 协程概览
- 渡劫 C++ 协程(2):实现一个序列生成器
- 渡劫 C++ 协程(3):序列生成器的泛化和函数式变换
- 渡劫 C++ 协程(4):通用异步任务 Task
- 渡劫 C++ 协程(5):协程的调度器
- 渡劫 C++ 协程(6):基于协程的挂起实现无阻塞的 sleep
- 渡劫 C++ 协程(7):用于协程之间消息传递的 Channel
- 渡劫 C++ 协程(8):通用 Awaiter
- 渡劫 C++ 协程(9):一个简单的示例
- 渡劫 C++ 协程(10):后记
准备工作
在本文当中,我将使用前文实现好的 Task
来发起一个简单的网络请求。
我会借助一些已有的框架来完成这次的目标:
1 | cpp-httplib/0.10.4 |
这些框架可以通过 conan 很轻松的完成安装。
示例实现
首先我们给出发起网络请求的核心代码:
1 | // 用协程包装网络请求,请求的处理调度到 std::async 上 |
使用 httplib 来完成网络请求的处理非常简单直接,我们只需要把 url 传入即可。通常我们的网络请求都会在 io 线程当中发起,因此我们将其调度到 AsyncExecutor
上。
接下来,我们再定义一个协程来调用 http_get
:
1 | Task<void, LooperExecutor> test_http() { |
程序运行结果如下:
1 | 22:10:54.046 [Thread-08056] (main.cpp:27) test_http: send request... |
在这个示例当中,我们没有使用协程来解决阻塞的问题,而是将一个异步的请求封装成同步的代码。test_http
当中的代码全程在 Looper 线程当中执行,尽管中间穿插了一个异步网络请求,但这看上去丝毫没有影响程序的连贯性和简洁性。
小结
本文的内容相对轻松,因为我们终于停止了基于协程的基础 API 的探索。
实际上,如果你发现你用到的某些 API 提供了异步回调,你完全可以使用 Awaiter
对其提供 co_await
的支持。
关于作者
霍丙乾 bennyhuo,Google 开发者专家(Kotlin 方向);《深入理解 Kotlin 协程》 作者(机械工业出版社,2020.6);《深入实践 Kotlin 元编程》 作者(机械工业出版社,2023.8);移动客户端工程师,先后就职于腾讯地图、猿辅导、腾讯视频。
- GitHub:https://github.com/bennyhuo
- 博客:https://www.bennyhuo.com
- bilibili:霍丙乾 bennyhuo
- 微信公众号:霍丙乾 bennyhuo