这是一篇关于如何从“用户视角”使用异步 Rust 以及理解其工作原理的系列文章的第一篇。
- 需求背景:有很多关于从用户视角使用异步 Rust 的指南,但了解其工作原理及
async
块的实际意义也很有价值,如理解为何会出现奇怪的固定错误等。 代码示例及解释:
- 展示了基本的异步函数
trick_or_treat
,引出对async fn
与其他fn
的差异及作用的疑问。 - 介绍了
Future
trait,它定义了可被await
的东西,简化后形如SimpleFuture
,其poll
方法用于询问Future
是否可继续,返回Poll::Ready
或Poll::Pending
。 - 给出了一些简单的
Future
实现示例,如总是产生随机数的FairDice
、永远等待的LookBusy
、需要被轮询 10 次才完成的Stubborn
以及委托给另一个Future
的LoadedDice
。还介绍了ready!
宏可简化match poll
的代码。 - 展示了如何通过保存共享状态在
enum
中实现多次await
,如FairDicePair
。同时提到原始的poll
能做async fn
无法表达的事情,如构建超时机制Timeout
。
- 展示了基本的异步函数
运行与组合:
- 定义了运行
Future
的函数run_future
,通过不断调用poll
直到返回Ready
来运行Future
,但这样会浪费 CPU 周期。 - 引入了组合子
combinators
,将特殊逻辑泛化为新的构建块供async fn
复用,如with_timeout
函数可对任意Future
设置超时。
- 定义了运行
- 输入输出:以从 TCP 套接字读取为例,展示了如何创建套接字、连接远程目的地、设置为非阻塞模式、读取消息等操作,通过
TcpRead
实现SimpleFuture
来读取套接字数据。 - 后续内容预告:文章只讨论了简化的
SimpleFuture
变体,后续将揭开更多细节,如解决SimpleFuture
的浪费问题的唤醒器(waker)将在下一次讨论,且相关内容已更新在https://natkr.com/2025-04-15-async-from-scratch-2/。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。