1 个不稳定版本
0.1.0 | 2021年7月26日 |
---|
在 异步 中排名第 1878
每月下载量 9,120
在 async-quic 中使用
7KB
当唤醒时无操作的唤醒器。适用于“立即执行”类型场景,其中未来不太可能被轮询多次,或者用于“自旋”执行器。
示例
一个非常低效的 block_on
函数实现,不断轮询未来。
use core::{future::Future, hint::spin_loop, task::{Context, Poll}};
use futures_lite::future::poll_fn;
use noop_waker::noop_waker;
fn block_on<R>(f: impl Future<Output = R>) -> R {
// pin the future to the stack
futures_lite::pin!(f);
// create the context
let waker = noop_waker();
let mut ctx = Context::from_waker(&waker);
// poll future in a loop
loop {
match f.as_mut().poll(&mut ctx) {
Poll::Ready(o) => return o,
Poll::Pending => spin_loop(),
}
}
}
// this future returns pending 5 times before returning ready
let mut counter = 0;
let my_future = poll_fn(|ctx| {
if counter < 5 {
counter += 1;
ctx.waker().wake_by_ref();
Poll::Pending
} else {
Poll::Ready(7)
}
});
assert_eq!(block_on(my_future), 7);