本文簡要介紹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 WaitTimeoutResult.timed_out用法及代碼示例
- Rust Wrapping.is_negative用法及代碼示例
- Rust Wrapping.from_le用法及代碼示例
- Rust Wrapping.reverse_bits用法及代碼示例
- Rust Wrapping.to_be用法及代碼示例
- Rust Wrapping.next_power_of_two用法及代碼示例
- Rust Write.write_all用法及代碼示例
- Rust Write.write_str用法及代碼示例
- Rust Windows用法及代碼示例
- Rust Weak.new用法及代碼示例
- Rust Write用法及代碼示例
- Rust Write.write_vectored用法及代碼示例
- Rust Wrapping.is_power_of_two用法及代碼示例
- Rust Wrapping.abs用法及代碼示例
- Rust WriterPanicked用法及代碼示例
- Rust Weak.from_raw用法及代碼示例
- Rust Weak.into_raw用法及代碼示例
- Rust Weak.upgrade用法及代碼示例
- Rust Write.by_ref用法及代碼示例
- Rust Wrapping.rotate_right用法及代碼示例
- Rust Wrapping.leading_zeros用法及代碼示例
- Rust Write.flush用法及代碼示例
- Rust Wrapping.signum用法及代碼示例
- Rust Write.write_all_vectored用法及代碼示例
- Rust Wrapping.trailing_zeros用法及代碼示例
注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 Trait std::task::Wake。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。