39|异步处理:async/await内部是怎么实现的?
该思维导图由 AI 生成,仅供参考
Waker 的调用机制
- 深入了解
- 翻译
- 解释
- 总结
异步处理在编程中扮演着重要角色,而async/await是一种常见的异步处理方式。本文深入探讨了async/await的内部实现原理,重点围绕Future接口、Context和Pin结构展开讨论。文章指出Rust标准库并不提供异步运行时,只规定了基本接口,具体实现由第三方异步运行时库决定。接着,文章详细解释了async函数内部生成的代码,以及如何将其转化为Future的实现,展示了其实际状态机的迁移过程。最后,文章指出这些看似简单的异步处理背后隐藏了一套复杂的状态机管理代码,进而引出了Pin的必要性。Pin的出现对解决自引用结构带来的潜在危害至关重要。通过对async/await内部实现原理的深入剖析,读者能够更好地理解其工作机制,为进一步深入学习提供了基础。文章还介绍了Unpin和PhantomPinned的作用,以及async产生的Future类型。最后,通过对Future接口各个部分的深入探讨,读者能够对async/await的实现原理有一个完整的认识。整体而言,本文通过深入剖析async/await的内部实现原理,为读者呈现了异步处理背后的复杂性,以及Pin和Unpin在异步处理中的重要性。
《陈天 · Rust 编程第一课》,新⼈⾸单¥68
全部留言(13)
- 最新
- 精选
- GengTeng我之前记录并翻译过无船同志(withoutboats)的一个讲座,供大家参考:https://gteng.org/2021/01/30/zero-cost-async-io/
作者回复: 👍
2021-11-3028 - 罗同学Pin了后的数据 所有者变成谁了?
作者回复: 所有者还是之前的变量,只不过一般会把它 shadow 掉,这样没有人可以拿到。当这个变量离开作用域时还是会被回收。 ```rust use std::pin::Pin; fn main() { let s = "hello".to_string(); println!("addr of s(stack): {:p}", &s); let s = Pin::new(s); println!("addr of pinned s: {:p}", &s); } ```
2021-11-293 - dvaBox<T>是Unpin,因为Box<T>实现了Unpin trait
作者回复: 👍
2021-12-181 - wowotuo讲得很牛逼,现在反反复复听了看了不下10次
作者回复: 👍
2022-01-12 - 良师益友以前在这里卡住了,这次说明白了,感谢老师
作者回复: 👍
2021-11-29 - 清风徐来有了Pin为啥还有!UnPin2022-02-2221
- Rustlab我越看越困惑, write_hello_file_async("/tmp/hello").await?;这里,如果只是生成loop,那这就是同步代码了,能详细讲一讲, write_hello_file_async("/tmp/hello").await?;在调用处是如何被处理,其如何注册到异步运行时、最后future的poll方法是怎么样被不断重复调用的吗?这里的poll里面有一个loop,我感觉真实场景不会这么干吧。2023-03-15归属地:湖南
- Rustlab我越看越困惑, write_hello_file_async("/tmp/hello").await?;这里,如果只是生成loop,那这就是同步代码了,能详细讲一讲, write_hello_file_async("/tmp/hello").await?;在调用处是如何被处理,其如何注册到异步运行时、最后future的poll方法是怎么样被不断重复调用的吗?这里的poll里面有一个loop,我感觉真实场景不会这么干吧。2023-03-15归属地:湖南
- 约书亚有些凌乱,在第二个move_creates_issue示例(使用了Pin的那个)里,move_it无法调用是因为原来的SelfReference类型的data(值)被shadow了,如果把data改个名字,move_it依旧可以调用,和Pin没啥关系? 不过如果将move_it与它上面的那条语句互换下位置,确实会编译不通过,原因是在有借用的情况下移动,那这么说我不使用Pin,随便使用一个&SelfReference或者&mut SelfReference,也能阻止移动呢?2022-11-23归属地:天津3
- doubled老师能具体讲讲phantomdata么,在Waker中为什么marker要是phantomdata<fn(&'a ())->&'a ()>,能不能使用phantomdata<&'a ()>或者使用phantomdata<&'a mut ()>2022-11-13归属地:福建