当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust Wake用法及代码示例


本文简要介绍rust语言中 Trait std::task::Wake 的用法。

用法

pub trait Wake {
    fn wake(self: Arc<Self>);

    fn wake_by_ref(self: &Arc<Self>) { ... }
}

在执行器上唤醒任务的实现。

此特征可用于创建 Waker 。执行器可以定义此特征的实现,并使用它来构造唤醒器以传递给在该执行器上执行的任务。

此特征是 memory-safe 和构造 RawWaker 的人体工程学替代方案。它支持通用执行器设计,其中用于唤醒任务的数据存储在 Arc 中。一些执行程序(尤其是嵌入式系统的执行程序)无法使用此 API,这就是为什么 RawWaker 作为这些系统的替代品存在的原因。

例子

一个基本的block_on 函数,它接受一个未来并在当前线程上运行它直到完成。

注意:这个例子为了简单而牺牲了正确性。为了防止死锁,生产级实现还需要处理中间调用thread::unpark以及嵌套调用。

use std::future::Future;
use std::sync::Arc;
use std::task::{Context, Poll, Wake};
use std::thread::{self, Thread};

/// A waker that wakes up the current thread when called.
struct ThreadWaker(Thread);

impl Wake for ThreadWaker {
    fn wake(self: Arc<Self>) {
        self.0.unpark();
    }
}

/// Run a future to completion on the current thread.
fn block_on<T>(fut: impl Future<Output = T>) -> T {
    // Pin the future so it can be polled.
    let mut fut = Box::pin(fut);

    // Create a new context to be passed to the future.
    let t = thread::current();
    let waker = Arc::new(ThreadWaker(t)).into();
    let mut cx = Context::from_waker(&waker);

    // Run the future to completion.
    loop {
        match fut.as_mut().poll(&mut cx) {
            Poll::Ready(res) => return res,
            Poll::Pending => thread::park(),
        }
    }
}

block_on(async {
    println!("Hi from inside a future!");
});

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Trait std::task::Wake。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。