[英]What is the relationship between Boost::Asio and C++20 coroutines?
我开始尝试通过阅读 文档和示例代码来学习 Boost::Asio。 我发现事情很难理解,特别是因为模型看起来类似于协程。
然后我决定从这个cppcon talk开始学习协程。 在链接的演讲中,在协程使用示例中给出了以下行。 该示例是在 2014 年编写的,因此语法可能与 C++20 协程不匹配。
auto conn = await Tcp::connect.Read("127.0.0.1", 1337)
这感觉类似于 Boost::Asio 的既定目标。 但是,在 Boost::Asio 文档的示例部分,有一个混合了 Boost::Asio 和 C++20 协程的示例。 (我还不明白这个例子。)
Boost::Asio 和协程有什么关系? 协程会替换 Boost::Asio 的一部分吗? 如果我不做网络,我还应该使用 Boost::Asio 吗? std::async
和senders/receivers提案在哪里适合所有这些?
Q. Boost::Asio 和协程有什么关系?
C++20 协程是任何符合 Asio 的异步 API 提供的完成令牌机制之一
问:协程会替代 Boost::Asio 的一部分吗?
不是1对1。
在实践中,人们可能觉得编写asio::spawn
(stackful) 协程的需要少了很多,因为在实践中很少需要堆叠性,并且相比之下使实现(非常)繁重。 此外,直到 Boost 1.81(?) asio::spawn
仍将依赖于 Boost Coroutine(正在努力删除它并直接在 Boost Context 之上实现该功能)。
C++20 协程似乎可以消除摩擦的另一个地方是提供双重 API(同步和异步)。 我听说有人建议可以透明地实现异步版本的同步版本。 我不了解这种模式的细节(以及它是否已经准备好用于生产代码)。
问:如果我不做网络,我还应该使用 Boost::Asio 吗?
应该? 不,但你可以。 一般来说,对于 c++20 协程,您将需要使用一些库,如cppcoro或确实是 Asio。 那是因为还没有标准化的用户级图书馆设施。
在 Asio 中,有趣的部分是:
通道( channel
和concurrent_channel
通道)、parallel_group、wait_for_{all,one,any} 等实验性内容
具有很大灵活性的通用设施coro
。 您可以将其视为 cppcoro 中最有用的 80%,但
全部在一个相对简单的类模板中:
coro<T>
-> 简单的生成器coro<T(U)>
-> 带输入的生成器coro<void, T>
任务产生T
与 Asio 执行器集成
该文档是一个相当不错的介绍¹,尤其是当您熟悉其他库/语言的概念时。
问:std::async 和 senders/receivers 提案在哪里适合所有这些?
我不确定。 我似乎记得 Chris Kohlhoff 写了那个提议。 这个概念可能已经潜伏在 Asio 的channel
/ deferred
抽象之下。
¹ 帽子提示@klemensmorgenstern
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.