在Rust(以及其他编程语言)中,关键字await
用于指示异步函数体中的挂起点.然而,我注意到,与其他编程语言(Pythongather
、Swift withTaskGroup
、JAVASCRIPTPromise.all
等)相反,Rust不要求并将拒绝在Tokyo::join!
宏后出现await
.
例如,在这个async
函数中,join!
之后没有await
:
use tokio::{io::Result, time::{sleep, Duration}, join};
async fn work() -> String {
sleep(Duration::from_secs(2)).await;
String::from("Work done")
}
#[tokio::main]
async fn main() -> Result<()> {
println!("Awaiting…");
let (o1, o2) = join!(
work(),
work(),
); // No `.await`
println!("{}, {}", o1, o2);
Ok(())
}
有没有什么技术原因导致join!
宏没有返回某种可以被await
编辑的聚合Future
或联接句柄?
隐式await
令人困惑,因为这个异步函数乍一看似乎没有任何挂起点(因此不需要是async
),我认为这可能会违背async-await
模式寻求显式设置挂起点的目的.