Day 1:非同步與 async/await 入門
學習目標
- 理解 async/await 的直覺
- 用 tokio 執行非同步任務
- 區分順序與並行執行
今日重點
安裝 tokio
[dependencies]
tokio = { version = "1", features = ["full"] }
async 函式
use tokio::time::{sleep, Duration};
async fn fetch_data(id: u32) -> String {
sleep(Duration::from_millis(100)).await; // 非同步等待
format!("Data for id: {}", id)
}
#[tokio::main]
async fn main() {
// 順序:一個跑完再下一個
let data1 = fetch_data(1).await;
let data2 = fetch_data(2).await;
println!("{} {}", data1, data2);
// 並行:同時開始
let (d1, d2) = tokio::join!(
fetch_data(1),
fetch_data(2)
);
println!("{} {}", d1, d2);
}
#[tokio::main] 把 async fn main 掛上 tokio runtime。.await 會「暫停目前任務,等待別人完成」,其間可以跑其他任務,這就是效率來源。
練習
async fn task(name: &str, ms: u64) -> String {
tokio::time::sleep(tokio::time::Duration::from_millis(ms)).await;
format!("{} done", name)
}
#[tokio::main]
async fn main() {
// 1. 順序執行兩個 task
let a = task("A", 10).await;
let b = task("B", 10).await;
println!("{} {}", a, b);
// 2. 用 join! 並行
let (a, b) = tokio::join!(task("A", 10), task("B", 10));
println!("{} {}", a, b);
}
自我檢查
深入連結