假设我想使用Tokio同时下载两个网页...
我可以使用tokio::spawn()
实现:
async fn v1() {
let t1 = tokio::spawn(reqwest::get("https://example.com"));
let t2 = tokio::spawn(reqwest::get("https://example.org"));
let (r1, r2) = (t1.await.unwrap(), t2.await.unwrap());
println!("example.com = {}", r1.unwrap().status());
println!("example.org = {}", r2.unwrap().status());
}
或者我可以使用tokio::join!()
来实现:
async fn v2() {
let t1 = reqwest::get("https://example.com");
let t2 = reqwest::get("https://example.org");
let (r1, r2) = tokio::join!(t1, t2);
println!("example.com = {}", r1.unwrap().status());
println!("example.org = {}", r2.unwrap().status());
}
在这两种情况下,两个请求都是同时进行的。但是,在第二种情况下,这两个请求在同一个任务中运行,因此在同一个线程上。
所以,我的问题是:
tokio::join!()
优于tokio::spawn()
吗?- 如果是,使用哪些场景?(与下载网页无关)
我猜产生新任务可能只有微小的开销,但就这样?
join!
(和select!
、try_join_all
等)来处理其中的所有内容。话虽如此,我不能说这是否是一种理想的策略。 - Dominick Pastore