小编Don*_*bin的帖子

Rust 中使用的“await”是什么意思?

这个问题可能在某种程度上与异步编程相关,而不是 Rust。但是经过大量谷歌搜索后,我认为仍然缺少一些内容。由于我正在学习 Rust,所以我会用 Rust 的方式来表达它。

先说一下我对异步编程的理解---毕竟这是基础,也许我错了也好,没有也好:

为了使程序高效运行,并发处理任务是必不可少的。然后使用线程,只要需要线程中的数据就可以加入该线程。但是线程不足以像服务器那样处理许多任务。那么就使用了线程池,但是在需要数据的时候又不知道哪个线程应该等待的情况下如何取数据呢?然后回调函数(简称cb)出现了。有了cb,只需要考虑cb中需要做的事情。另外,为了让cpu的开销很小,绿色线程就出现了。

但是,如果异步等待的事情需要一个接一个地执行,这会导致“回调地狱”怎么办?好的,“future/promise”风格出现了,它让代码看起来像同步代码,或者可能像一条链(就像在 javascript 中)。但代码看起来仍然不太好。最后,“async/await”风格出现,作为“future/promise”风格的另一种语法糖。通常,具有绿色线程风格的“异步/等待”被称为“协程”,无论是仅使用一个本机线程还是在异步任务上使用多本机线程。

===============================================

据我目前所知,关键字“await”只能在“async”函数的范围内使用,并且只有“async”函数可以“等待”。但为什么?既然已经有了“异步”,它是用来做什么的?无论如何,我测试了下面的代码:

use async_std::{task};


// async fn easy_task() {
//     for i in 0..100 {
//         dbg!(i);
//     }
//     println!("finished easy task");
// }

async fn heavy_task(cnt1: i32, cnt2: i32) {
    for i in 0..cnt1 {
        println!("heavy_task1 cnt:{}", i);
    }

    println!("heavy task: waiting sub task");
    // normal_sub_task(cnt2);
    sub_task(cnt2).await;
    println!("heavy task: sub task finished");

    for i in 0..cnt1 {
        println!("heavy_task2 cnt:{}", i);
    }
    println!("finished heavy task");
}

fn …
Run Code Online (Sandbox Code Playgroud)

multithreading asynchronous rust async-await

4
推荐指数
1
解决办法
1734
查看次数

标签 统计

async-await ×1

asynchronous ×1

multithreading ×1

rust ×1