On this page
Struct std::task::Waker
pub struct Waker { /* private fields */ }
A Waker
is a handle for waking up a task by notifying its executor that it is ready to be run.
This handle encapsulates a RawWaker
instance, which defines the executor-specific wakeup behavior.
The typical life of a Waker
is that it is constructed by an executor, wrapped in a Context
, then passed to Future::poll()
. Then, if the future chooses to return Poll::Pending
, it must also store the waker somehow and call Waker::wake()
when the future should be polled again.
Implements Clone
, Send
, and Sync
; therefore, a waker may be invoked from any thread, including ones not in any way managed by the executor. For example, this might be done to wake a future when a blocking function call completes on another thread.
Note that it is preferable to use waker.clone_from(&new_waker)
instead of *waker = new_waker.clone()
, as the former will avoid cloning the waker unnecessarily if the two wakers wake the same task.
Implementations
impl Waker
pub fn wake(self)
Wake up the task associated with this Waker
.
As long as the executor keeps running and the task is not finished, it is guaranteed that each invocation of wake()
(or wake_by_ref()
) will be followed by at least one poll()
of the task to which this Waker
belongs. This makes it possible to temporarily yield to other tasks while running potentially unbounded processing loops.
Note that the above implies that multiple wake-ups may be coalesced into a single poll()
invocation by the runtime.
Also note that yielding to competing tasks is not guaranteed: it is the executor’s choice which task to run and the executor may choose to run the current task again.
pub fn wake_by_ref(&self)
Wake up the task associated with this Waker
without consuming the Waker
.
This is similar to wake()
, but may be slightly less efficient in the case where an owned Waker
is available. This method should be preferred to calling waker.clone().wake()
.
pub fn will_wake(&self, other: &Waker) -> bool
Returns true
if this Waker
and another Waker
would awake the same task.
This function works on a best-effort basis, and may return false even when the Waker
s would awaken the same task. However, if this function returns true
, it is guaranteed that the Waker
s will awaken the same task.
This function is primarily used for optimization purposes — for example, this type’s clone_from
implementation uses it to avoid cloning the waker when they would wake the same task anyway.
pub unsafe fn from_raw(waker: RawWaker) -> Waker
Creates a new Waker
from RawWaker
.
The behavior of the returned Waker
is undefined if the contract defined in RawWaker
’s and RawWakerVTable
’s documentation is not upheld. Therefore this method is unsafe.
pub const fn noop() -> Waker
noop_waker
#98286)
Creates a new Waker
that does nothing when wake
is called.
This is mostly useful for writing tests that need a Context
to poll some futures, but are not expecting those futures to wake the waker or do not need to do anything specific if it happens.
Examples
#![feature(noop_waker)]
use std::future::Future;
use std::task;
let waker = task::Waker::noop();
let mut cx = task::Context::from_waker(&waker);
let mut future = Box::pin(async { 10 });
assert_eq!(future.as_mut().poll(&mut cx), task::Poll::Ready(10));
pub fn as_raw(&self) -> &RawWaker
waker_getters
#87021)
Get a reference to the underlying RawWaker
.
Trait Implementations
impl Clone for Waker
fn clone(&self) -> Waker
fn clone_from(&mut self, source: &Waker)
source
. Read more
impl Debug for Waker
fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>
impl Drop for Waker
impl<W> From<Arc<W>> for Waker
where
W: Wake + Send + Sync + 'static,
fn from(waker: Arc<W>) -> Waker
Use a Wake
-able type as a Waker
.
No heap allocations or atomic operations are used for this conversion.
impl Send for Waker
impl Sync for Waker
impl Unpin for Waker
Auto Trait Implementations
impl RefUnwindSafe for Waker
impl UnwindSafe for Waker
Blanket Implementations
impl<T> Any for T
where
T: 'static + ?Sized,
impl<T> Borrow<T> for T
where
T: ?Sized,
impl<T> BorrowMut<T> for T
where
T: ?Sized,
impl<T> From<T> for T
fn from(t: T) -> T
Returns the argument unchanged.
impl<T, U> Into<U> for T
where
U: From<T>,
fn into(self) -> U
Calls U::from(self)
.
That is, this conversion is whatever the implementation of From<T> for U
chooses to do.
impl<T> ToOwned for T
where
T: Clone,
type Owned = T
fn to_owned(&self) -> T
fn clone_into(&self, target: &mut T)
impl<T, U> TryFrom<U> for T
where
U: Into<T>,
type Error = Infallible
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto<U> for T
where
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
© 2010 The Rust Project Developers
Licensed under the Apache License, Version 2.0 or the MIT license, at your option.
https://doc.rust-lang.org/std/task/struct.Waker.html