根据 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了。