#[repr(transparent)]pub struct Waker { /* private fields */ }
Expand description
Waker
是通过通知执行者准备运行来唤醒任务的句柄。
该句柄封装了 RawWaker
实例,该实例定义了特定于执行者的唤醒行为。
Waker
的典型生命周期是它由执行程序构造,包裹在 Context
中,然后传递给 Future::poll()
。
然后,如果 future 选择返回 Poll::Pending
,它还必须以某种方式存储唤醒器,并在应该再次轮询 future 时调用 Waker::wake()
。
实现 Clone
、Send
和 Sync
; 因此,可以从任何线程调用唤醒器,包括不以任何方式由执行程序管理的线程。
例如,当阻塞函数调用在另一个线程上完成时,可以这样做以唤醒 future。
Implementations§
source§impl Waker
impl Waker
sourcepub fn wake(self)
pub fn wake(self)
唤醒与此 Waker
相关的任务。
只要 executor 一直在运行,任务还没有完成,就保证每次调用 wake()
(或者 wake_by_ref()
)) 之后都会至少跟这个 Waker
所属的任务的一个 poll()
。
这使得在运行潜在的无限处理循环时可以暂时让步给其他任务。
请注意,以上暗示多个唤醒可能会被运行时合并为单个 poll()
调用。
另请注意,不能保证屈服于竞争任务: 执行者选择运行哪个任务,执行者可以选择再次运行当前任务。
sourcepub fn wake_by_ref(&self)
pub fn wake_by_ref(&self)
唤醒与此 Waker
相关的任务,而不消耗 Waker
。
这类似于 wake()
,但在拥有 Waker
可用的情况下效率可能会稍低。
此方法应该比调用 waker.clone().wake()
更可取。
sourcepub fn will_wake(&self, other: &Waker) -> bool
pub fn will_wake(&self, other: &Waker) -> bool
如果此 Waker
和另一个 Waker
将唤醒相同的任务,则返回 true
。
该函数在尽力而为的基础上起作用,即使 Waker
s 唤醒相同的任务,也可能返回 false。
但是,如果此函数返回 true
,则可以确保 Waker 唤醒相同的任务。
该函数主要用于优化目的。