异步从零开始 3:靠墙钉住 | natkr 的漫谈

主要观点:介绍了异步编程中的一些关键概念,如pollingsleepingpinning等,通过具体代码示例讲解了相关特性和原理,包括关联类型、Future trait、pin操作等,最后以TrickOrTreat示例展示如何使用这些概念使异步代码更安全。

关键信息:

  • 关联类型类似 trait 泛型,但不用于选择正确的 trait 实现,可帮助类型推断,如Future::Output是关联类型。
  • Future trait 及其实现,不同的impl可能会冲突,如不能为同一类型定义多个不同的Output关联类型。
  • pin操作可限制对值的操作,防止值被移动或部分修改,Pin结构体提供了相关方法,如get_refset等。
  • Unpin标记 trait 可让类型选择不进行pin操作,Rust 默认对新类型实现Unpin,除非包含*mut T等自引用类型。
  • pin-project宏可方便地进行投影操作,将结构体或枚举的字段投影为Pin或普通引用,同时保持pin要求。

重要细节:

  • 展示了如何将async fn转换为状态机enumFuture实现,并通过TrickOrTreat示例说明在处理自引用时可能遇到的问题,如借用自身导致的编译错误。
  • 提到了使用原始指针的风险,如失去借用检查、可能导致对象被意外移动等。
  • 讲解了pin操作在Future中的应用,以及如何与Box等类型配合使用,还介绍了PhantomPinned类型的作用。
  • 强调了在使用pin-project时的一些注意事项,如只有#[pin]标记的字段才会被考虑用于Unpin判断等。
阅读 23
0 条评论