Rust如何实现wait关键字



据我所知,Rust对未来调用的await似乎调用了未来的轮询方法。然而,poll方法需要一个上下文参数,如果我在未来手动调用poll方法,我需要一个执行器来生成上下文,这样就可以生成一个唤醒程序来调用wake((。但是编译器如何知道如何获取上下文呢?

由于await只允许在async函数(或块(中使用,因此您已经有了上下文。它对你来说是隐藏的,但编译器可以访问它

如果你对它的确切工作方式感兴趣,你可以查看HIR。一个类似的函数:

async fn bar() {
foo().await;
}

生成如下内容(您可以在操场上选择"显示HIR"(:

fn bar() -> impl Future {
std::future::from_generator(move |mut _task_context| {
let _t = {
match std::future::IntoFuture::into_future(foo()) {
mut __awaitee => loop {
match unsafe {
std::future::Future::poll(
std::pin::Pin::new_unchecked(&mut __awaitee),
std::future::get_context(_task_context),
)
} {
std::task::Poll::Ready { 0: result } => break result,
std::task::Poll::Pending {} => {}
}
_task_context = (yield ());
},
};
};
_t
})
}

您可以看到编译器使用了隐藏的_task_context参数。

编译器中负责降低await的代码可以在这里找到。

最新更新