【问题标题】:What is the meaing of yield on tokio async rust?tokio async rust 的 yield 是什么意思?
【发布时间】:2023-01-19 03:12:18
【问题描述】:

在阅读 Tokio Rust 文档时,它讨论了将控制权交还给线程。这是否意味着该函数结束了他的执行并返回了一个值?

tokio.rs 的确切引用是:

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

【问题讨论】:

  • 不,这意味着函数表明它正在等待 IO,任务调度程序现在可以重用同一个线程来运行其他任务。
  • @IvanC 任务调度程序现在如何重试?它只是尝试,如果它失败了继续做其他事情或者比这更复杂?
  • 最简单的执行者可能是一个繁忙的循环,反复轮询未来,是的。不过,tokio 之类的东西要复杂得多。

标签: asynchronous rust rust-tokio


【解决方案1】:

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

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

【讨论】:

  • 调度程序如何知道他何时可以继续执行任务?它可能依赖于板条箱,所以在 tokio 的情况下,它是如何工作的?
【解决方案2】:

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

这是一个例子:

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(()));
}

Playground

通常,Waker 注册到 future 以便在某些事件发生时再次轮询,然后调度程序在事件发生时轮询它。例如,如果你在 tokio 中做 I/O,给你 future 的 waker 会注册它,以便在 I/O 就绪时再次轮询。

【讨论】:

    猜你喜欢
    • 2020-06-26
    • 1970-01-01
    • 2022-10-02
    • 2022-07-22
    • 2020-06-28
    • 2020-06-20
    • 1970-01-01
    • 2020-12-19
    相关资源
    最近更新 更多