當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。