根据 rust 异步原理,async 块生成的 Future 实现内部可能会存在自引用。所以 poll 方法只接受被“pin”住的 Future。
可是直到 poll 方法被调用前,Future 是可以不被“pin”的,也就可以随意地在方法之间 move。一旦其被 move,那结构内部的自引用不就应该失效了吗?
但实际上,tokio 和 async-std 内的 spawn、block_on 等方法接受的都是裸露的 Future,无需被 Pin 包裹。为什么这种 move 是安全的呢?
1
共 2 条评论, 1 页
评论区
写评论原来如此,感谢感谢!
--
👇
catsalwaysmeow: > 一旦其被
move,那结构内部的自引用不就应该失效了吗?在一个
impl Future被poll前,它是完全没有开始执行的,其内部的变量们还没有被初始化,也就没有「自引用」的存在。它在被传入block_on之后,会被pin住,然后调用第一次poll。在第一次poll结束后,它才有可能成为一个「自引用结构」。但此时它已经被pin住,没有办法再被move了。在一个
impl Future被poll前,它是完全没有开始执行的,其内部的变量们还没有被初始化,也就没有「自引用」的存在。它在被传入block_on之后,会被pin住,然后调用第一次poll。在第一次poll结束后,它才有可能成为一个「自引用结构」。但此时它已经被pin住,没有办法再被move了。