Rust 程序设计(第 2 版)
Jim Blandy, Jason Orendorff, Leonora F. S. Tindall
软件工程师
1469 人已学习
立即订阅
登录后,你可以任选4讲全文学习
推荐试读
换一换
课程目录
已完结/共 41 讲
时长 02:41
时长 06:30
时长 10:04
时长 01:05
时长 50:06
时长 31:35
时长 34:39
时长 29:11
时长 37:15
时长 23:44
时长 44:19
时长 29:54
时长 39:01
时长 01:38
时长 01:15
时长 00:37
Rust 程序设计(第 2 版)
15
15
1.0x
00:00/00:00
登录|注册

第 20 章 异步编程(3)

20.4 固定(Pin

尽管异步函数和异步块对于编写清晰的异步代码至关重要,但处理它们的 Future 时要小心一点儿。Pin 类型有助于确保 Rust 安全地使用它们。
本节首先会展示为什么异步函数调用和异步块的 Future 不能像普通 Rust 值那样随意处理;然后会展示 Pin 如何用作指针的“许可印章”,我们可以依靠这些“盖章指针”来安全地管理此类 Future;最后会展示几种使用 Pin 值的方法。

20.4.1 Future 生命周期的两个阶段

考虑下面这个简单的异步函数:
use async_std::io::prelude::*;
use async_std::;
async fn fetch_string(address: &str) -> io::Result<String> {
let mut socket = net::TcpStream::connect(address).await➋?;
let mut buf = String::new();
socket.read_to_string(&mut buf).await➌?;
Ok(buf)
}
这会打开到给定地址的 TCP 连接,并以 String 的形式返回服务器发送的任何内容。标有 ➊、➋ 和 ➌ 的点是恢复点,即异步函数代码中可以暂停执行的点。
假设你调用它,但没有等待,就像下面这样:
let response = fetch_string("localhost:6502");
现在 response 是一个 Future,它准备在 fetch_string 的开头开始执行,并带有给定的参数。在内存中,Future 看起来如图 20-5 所示。
图 20-5:为调用 fetch_string 而构建的 Future
由于我们刚刚创建了这个 Future,因此它认为执行应该从函数体顶部的恢复点 ➊ 开始。在这种状态下,Future 唯一能给出的值就是函数参数。
现在假设你对 response 进行了几次轮询,并且它在函数体中到达了下面这个点:
socket.read_to_string(&mut buf).await➌?;
进一步假设 read_to_string 的结果尚未就绪,因此轮询会返回 Poll::Pending。此时,Future 看起来如图 20-6 所示。
图 20-6:同一个 Future,正在等待 read_to_string
Future 必须始终保存下一次轮询时恢复执行需要的所有信息。在这种情况下是如下内容。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

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 版)》
立即购买
登录 后留言

精选留言

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