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

Playground.

通常,当某个事件发生时,Waker个寄存器将被再次轮询到Future,然后当事件发生时,调度器再轮询它.例如,如果您在Tokio中执行I/O,则为您的future 提供的唤醒程序将注册它,以便在I/O准备好时再次进行轮询.

Rust相关问答推荐

关联类型(类型参数)命名约定

如何对字符串引用的引用向量进行排序,而不是对最外层的引用进行排序?

抽象RUST中的可变/不可变引用

如何为utoipa中的可选查询参数生成OpenAPI模式?

下载压缩文件

使用Box优化可选的已知长度数组的内存分配

告诉Rust编译器返回值不包含构造函数中提供的引用

使用Py03从Rust调用Python函数时的最佳返回类型

定义只有一些字段可以缺省的 struct

关于 map 闭合求和的问题

为什么Deref类特征不构成?

写入引用会更新基础值,但引用会打印意外的值

在 Rust 中,是否可以定义一个需要实现类型的构造函数的对象安全特征?

在给定 Rust 谓词的情况下,将 Some 转换为 None 的惯用方法是什么?

Rust HRTB 是相同的,但编译器说一种类型比另一种更通用

Rustfmt 是否有明确类型的选项?

有没有办法隐藏类型定义?

你能用 Rust 和 winapi 制作 Windows 桌面应用程序吗?

为什么 std::iter::Peekable::peek 可变地borrow self 参数?

如何在宏中的多个参数上编写嵌套循环?