繁体   English   中英

在 Rust 中,进行 function 的“异步”会得到什么?

[英]In Rust, what is gained from making a function 'async'?

我知道async function 将返回一个 Future,并且在那个未来调用.await会重复调用poll()直到它完成,但我不明白它与常规 function 之间的区别。它是否给出任何如果async没有它就可以工作,那么它有什么好处?

我有两个版本的代码做同样的事情。 将“实验”功能视为与#[tokio::main]一起运行的主要功能。

一个版本调用常规 function 来创建可以与tokio::spawn()异步运行的代码( 操场链接,尽管它似乎没有很好地显示 output):

pub async fn experiment1() {
    spawn_task(1);
    spawn_task(2);

    loop {
        println!("3");
        tokio::time::sleep(Duration::from_secs(1)).await;
    }
    
}

fn spawn_task(n: i32) {
    tokio::spawn(async move {
       loop {
           println!("{n}");
           tokio::time::sleep(Duration::from_secs(1)).await;
       }
    });
}

下面是 output(每秒打印 3 个数字,这是 3 秒的输出)。 每个循环同时运行。

3
1
2
3
2
1
3
1
2

另一个版本使用asyncawait游乐场链接,尽管它似乎没有很好地显示 output):

pub async fn experiment3() {
    spawn_task(1).await;
    spawn_task(2).await;

    loop {
        println!("3");
        tokio::time::sleep(Duration::from_secs(1)).await;
    }
    
}

async fn spawn_task(n: i32) {
    tokio::spawn(async move {
       loop {
           println!("{n}");
           tokio::time::sleep(Duration::from_secs(1)).await;
       } 
    });
}

下面是 output(每秒打印 3 个数字,这是 3 秒的输出)。 每个循环也同时运行。

3
1
2
3
1
2
3
2
1

当您仅像示例中那样运行同步代码时,唯一的区别是您将返回类型从普通T更改为impl Future<Output = T> 您可能希望使用它在需要异步 function 的地方使用其他同步函数。

当您实际在其中使用异步代码时,真正的好处就会出现:

fn fun() {
    // this is not allowed because we're not inside an async block or function
    tokio::time::sleep(Duration::from_secs(1)).await;
}

上面的 function 是不允许的,为了让它工作我们必须将它声明为async function:

async fn fun() {
    // we can use await here
    tokio::time::sleep(Duration::from_secs(1)).await;
}

暂无
暂无

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

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