本文简要介绍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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。