我正在尝试与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我是不是漏掉了什么?
发布于 2021-11-22 21:16:30
您正在调用std的休眠函数,该函数将使您的程序正在运行的OS线程进入休眠状态。如果改为调用tokio::time::sleep函数,则应该并发计算期货。
要在执行中启用实际的并行性,您需要使用tokio::task::spawn让运行时决定在哪个线程上运行衍生的未来。
要进一步了解什么是阻塞,我推荐这篇优秀的博客文章:https://ryhl.io/blog/async-what-is-blocking/
https://stackoverflow.com/questions/70072388
复制相似问题