繁体   English   中英

tokio async rust 的 yield 是什么意思?

[英]What is the meaing of yield on tokio async rust?

在阅读 Tokio rust 文档时,它谈到将控制权交还给线程。 这是否意味着function结束了他的执行并返回了一个值?

tokio.rs 的确切引用是:

async fn 定义看起来像常规的同步 function,但操作是异步的。 Rust 将编译时的 async fn 转换为异步操作的例程。 async fn 中对 .await 的任何调用都会将控制权交还给线程。 当操作在后台进行时,线程可能会做其他工作。

您可以将 tokio(和其他异步运行时)视为调度程序,将异步函数视为要完成的任务。 在这种情况下,'yield' 意味着正在运行的任务可以决定暂停执行以将控制权交还给调度程序,以便线程可以用于处理另一个任务(如果有其他任务排队)。 如果没有其他任务可用,那么调度程序可能会决定继续执行之前的任务。 任务没有结束。 这更像是我们在任务中保存我们的位置,以便我们稍后可以 go 回到它。

因此,当您调用异步 function 时,您实际上是在向调度程序提供一个新任务。 然后,当您使用.await时,您是在告诉调度程序您要等待该任务的结果。 这使得 yield 变得可取,因为在其他任务完成之前我们无能为力,我们希望释放资源以便在我们等待的同时处理其他任务。

它没有结束,只是暂停了。 当未来将再次被投票时,它将继续。

这是一个例子:

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的waker会注册它,等I/O准备好再轮询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM