当阅读Tokio Rust文档时,它谈到将控制权交还给线程.这是否意味着该函数结束了执行并返回了一个值?
Tokio.rs的确切引语是:
Async FN定义看起来像一个常规的同步函数,但它是异步操作的.Rust在编译时将异步FN转换为异步操作的 routine .在异步FN内对.aWait的任何调用都会将控制权返回给线程.当操作在后台进行时,该线程可以执行其他工作.
当阅读Tokio Rust文档时,它谈到将控制权交还给线程.这是否意味着该函数结束了执行并返回了一个值?
Tokio.rs的确切引语是:
Async FN定义看起来像一个常规的同步函数,但它是异步操作的.Rust在编译时将异步FN转换为异步操作的 routine .在异步FN内对.aWait的任何调用都会将控制权返回给线程.当操作在后台进行时,该线程可以执行其他工作.
它并没有结束,只是暂停了一下.当future 再次被调查时,这种情况将继续下go .
下面是一个例子:
use std::future::Future;
use std::task::{Context, Poll};
async fn bar() {
// Force to yield back to the caller.
let mut yielded = false;
std::future::poll_fn(move |_| {
if !yielded {
yielded = true;
Poll::Pending
} else {
Poll::Ready(())
}
})
.await;
}
async fn foo() {
println!("before");
bar().await;
println!("after");
}
fn main() {
let waker = futures::task::noop_waker();
let mut context = Context::from_waker(&waker);
let mut future = Box::pin(foo());
// First, poll the future once.
assert_eq!(future.as_mut().poll(&mut context), Poll::Pending);
// Now the future is paused at the `.await` inside `bar()`. Poll it again so it completes.
assert_eq!(future.as_mut().poll(&mut context), Poll::Ready(()));
}
通常,当某个事件发生时,Waker
个寄存器将被再次轮询到Future,然后当事件发生时,调度器再轮询它.例如,如果您在Tokio中执行I/O,则为您的future 提供的唤醒程序将注册它,以便在I/O准备好时再次进行轮询.