使用join和tokio来增强并发性



我正在尝试用join并行运行两个函数。

我的代码很简单:

tokio = { version = "1.14.0", features = ["full"] }
use tokio::join;
use std::thread::sleep;
use std::time::{Duration, Instant};
async fn fn_1() -> i8 {
sleep(Duration::from_secs(2));
2
}
async fn fn_2() -> i8 {
sleep(Duration::from_secs(2));
1
}
#[tokio::main]
async fn main() -> () {
let now = Instant::now();
println!("start: {:#?}", now.elapsed());
let a = fn_1();
let b = fn_2();
join!(a, b);
println!("end: {:#?}", now.elapsed());
}

但无论我做什么,这都需要4s——2s + 2s——而如果我没有错的话,应该需要2s:

start: 37ns
end: 4.01036111s

我有什么东西不见了吗?

您正在调用std的睡眠函数,该函数使运行程序的操作系统线程进入睡眠状态。如果您改为调用tokio::time::sleep函数,则应同时评估未来。

为了在执行中实现实际的并行性,您需要使用tokio::task::spawn让运行时决定在哪个线程上运行派生的future

为了进一步了解什么是阻塞,我推荐这篇优秀的博客文章:https://ryhl.io/blog/async-what-is-blocking/

最新更新