我正在嘗試并行運行兩個函式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());
}
但無論我做什么,這都需要 4 秒————2s 2s如果我沒記錯的話應該需要 2 秒:
start: 37ns
end: 4.01036111s
有什么我想念的嗎?
uj5u.com熱心網友回復:
您正在呼叫 std 的 sleep 函式,該函式使您的程式正在運行的作業系統執行緒進入睡眠狀態。如果您tokio::time::sleep改為呼叫函式,則應同時評估期貨。
要在執行中啟用實際并行性,您需要使用tokio::task::spawn讓運行時決定在哪個執行緒上運行衍生的未來。
要進一步了解什么是阻塞,我推薦這篇優秀的博客文章:https : //ryhl.io/blog/async-what-is-blocking/
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/365412.html
