[英]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
另一个版本使用async
和await
( 游乐场链接,尽管它似乎没有很好地显示 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.