gpt4 book ai didi

rust - 什么时候应该使用 tokio::join!() 而不是 tokio::spawn()?

转载 作者:行者123 更新时间:2023-12-04 13:05:32 25 4
gpt4 key购买 nike

假设我想与 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() ?
  • 如果是,在哪些情况下? (它与下载网页无关)

  • 我猜产生一个新任务的开销很小,但就是这样吗?

    最佳答案

    我通常会从另一个角度看待这个问题;我为什么要使用 tokio::spawntokio::join ?生成一个新任务比加入两个 Future 有更多的限制,'static要求可能非常烦人,因此不是我的首选。
    除了产生任务的成本之外,我猜这是相当微不足道的,还有在完成原始任务时发出信号的成本。我也猜测这是微不足道的,但您必须在您的环境和异步工作负载中测量它们,以查看它们是否真的有影响。
    但您是对的,使用两个任务的最大好处是它们有机会并行工作,而不仅仅是并发工作。但另一方面,async最适合需要大量等待的 I/O 密集型工作负载,并且根据您的工作负载,这种缺乏并行性不太可能产生太大影响。
    总而言之,tokio::join使用起来更好更灵活,我怀疑技术差异会影响性能。但一如既往:测量!

    关于rust - 什么时候应该使用 tokio::join!() 而不是 tokio::spawn()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69638710/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com