Rust 并发编程实战课
晁岳攀(鸟窝)
前微博技术专家,知名微服务框架 rpcx 作者
565 人已学习
新⼈⾸单¥98
登录后,你可以任选4讲全文学习
课程目录
已更新 19 讲/共 38 讲
Rust 并发编程实战课
15
15
1.0x
00:00/00:00
登录|注册

17|躬行实践,洞悉其理:自己动手实现一个Future

你好,我是鸟窝。
上几节课我们学习了 Rust 的异步编程和几种常见的异步运行时,以及异步编程应用的场景以及陷阱,如果你觉得还不过瘾,那么这节课就让我们来学习如何实现一个自己的 Future。
我们可以通过 ready 创建一个无需等待的 Future,也可以通过 pending 创建一个永远不会完成的 Future。这两种方式是最极端的两个场景,更多的情况下,如果我们是一个库的实现者,我们可能要实现自己的异步库,实现自己的 Future。就像 tokio、async_std 实现的各种异步 io、net 库一样。

一个简单的 Delay future

下面我将尝试解释如何在 Rust 中手动实现一个 Future,并解释其背后的原理。

Future 的核心概念

Future 代表一个异步操作的最终结果。它有两种状态:
Pending(挂起):操作尚未完成。
Ready(就绪):操作已完成,结果可用。
Future 的主要方法是 poll(),它被调用来检查 Future 是否已经完成。poll() 方法返回一个 Poll 枚举。
enum Poll<T> {
Ready(T),
Pending,
}
简化版 Future 实现
下面是一个简单的 Future 实现,它模拟一个延迟操作:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. Rust中实现自定义Future的核心概念是使用`poll()`方法来检查Future是否已经完成,以及使用`Poll`枚举来表示Future的两种状态:Pending和Ready。 2. `futures-rs`库是Rust异步编程生态系统中的重要库,提供了处理Future、Stream和其他异步操作的工具和抽象,尤其在处理复杂的异步场景时具有重要作用。 3. `futures-rs`提供了丰富的`Future`组合器,例如`map`、`and_then`、`or_else`、`join`、`select`等,用于方便地组合、转换和控制`Future`,使得编写复杂的异步流程变得更加简洁和易读。 4. `futures-rs`定义了`Stream` trait,用于表示异步产生的一系列值,类似于迭代器,但是异步的。提供了各种`Stream`组合器和实用函数,用于处理和转换异步数据流。 5. `futures-rs`定义了`Sink` trait,用于支持异步数据的写入,提供了`start_send`、`poll_ready`和`poll_flush`等方法,用于异步发送数据。 6. `futures-rs`提供了几个常用的宏,如`join!`、`try_join!`、`pending!`和`pin_mut!`,用于处理异步编程中的各种场景,例如同时轮询多个Future、创建可变的Pin等。 7. `poll!`宏用于在当前的`async`上下文中轮询一个Future一次,模拟执行器的行为,返回`Poll<T>`表示Future的状态。 8. `select!`宏用于同时轮询多个futures和streams,并执行第一个完成的future的分支,返回future的执行结果。 9. `stream_select`宏用于组合多个具有相同Item类型的所有流(stream)变成一个,返回流的元素。 10. `futures-rs`库在Rust异步编程中扮演着重要的角色,为开发者提供了丰富的工具和抽象,使得处理异步操作变得更加简洁和高效。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Rust 并发编程实战课》
新⼈⾸单¥98
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部