第 20 章 异步编程(3)
吉姆•布兰迪
20.4 固定(Pin)
尽管异步函数和异步块对于编写清晰的异步代码至关重要,但处理它们的 Future 时要小心一点儿。Pin 类型有助于确保 Rust 安全地使用它们。
本节首先会展示为什么异步函数调用和异步块的 Future 不能像普通 Rust 值那样随意处理;然后会展示 Pin 如何用作指针的“许可印章”,我们可以依靠这些“盖章指针”来安全地管理此类 Future;最后会展示几种使用 Pin 值的方法。
20.4.1 Future 生命周期的两个阶段
考虑下面这个简单的异步函数:
这会打开到给定地址的 TCP 连接,并以 String 的形式返回服务器发送的任何内容。标有 ➊、➋ 和 ➌ 的点是恢复点,即异步函数代码中可以暂停执行的点。
假设你调用它,但没有等待,就像下面这样:
现在 response 是一个 Future,它准备在 fetch_string 的开头开始执行,并带有给定的参数。在内存中,Future 看起来如图 20-5 所示。
![](https://static001.geekbang.org/files/resource/ebook/100006/image00891.jpeg)
图 20-5:为调用 fetch_string 而构建的 Future
由于我们刚刚创建了这个 Future,因此它认为执行应该从函数体顶部的恢复点 ➊ 开始。在这种状态下,Future 唯一能给出的值就是函数参数。
现在假设你对 response 进行了几次轮询,并且它在函数体中到达了下面这个点:
进一步假设 read_to_string 的结果尚未就绪,因此轮询会返回 Poll::Pending。此时,Future 看起来如图 20-6 所示。
![](https://static001.geekbang.org/files/resource/ebook/100006/image00892.jpeg)
图 20-6:同一个 Future,正在等待 read_to_string
Future 必须始终保存下一次轮询时恢复执行需要的所有信息。在这种情况下是如下内容。
公开
同步至部落
取消
完成
0/2000
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
![](https://static001.geekbang.org/resource/image/d0/e4/d0880927e2a522a038be2d04bf19dfe4.png)
Rust中的异步编程中的固定(Pin)类型在处理异步函数和异步块的Future时需要小心。Pin类型作为指针的“许可印章”,确保Rust安全地管理Future。文章深入解析了Pin类型的应用,讲解了Future的生命周期和移动的脆弱性,以及Pin类型如何保护Future的安全性。Pin类型限制了指针的用法,确保Future一旦被轮询就不能移动。对于Unpin类型的Future,Pin只是指向该类型指针的一个无聊包装器。当为自己的Unpin类型实现Future时,poll实现可以将self视为&mut Self,而不是Pin<&mut Self>。这篇文章为读者提供了深入的技术内容,帮助他们快速了解异步编程中Future的生命周期和移动的脆弱性。 在异步编程中,Pin类型的应用对于确保Future的安全性至关重要。文章深入探讨了Pin类型的限制和Unpin类型的Future的处理方式,为读者提供了深入的技术内容。此外,文章还探讨了异步代码的优势,包括内存使用、任务创建速度和上下文切换速度等方面的比较。通过对异步代码的优势进行分析,读者可以更好地了解异步编程适用于哪些问题场景。总的来说,本文为读者提供了深入的技术视角,帮助他们快速了解异步编程中Future的生命周期和移动的脆弱性,以及异步代码的优势和适用场景。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Rust 程序设计(第 2 版)》
《Rust 程序设计(第 2 版)》
立即购买
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论