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);
}

自我檢查

  • 了解 async fn 和 .await 的意義
  • 會用 #[tokio::main]
  • 知道 join! 並行 vs 順序 await 的差別
  • 理解「opが likely async 的判斷」

深入連結