async/await

從高層次的角度來看,非同步的 Rust 程式碼看起來很像「一般的」同步程式碼:

use futures::executor::block_on;

async fn count_to(count: i32) {
    for i in 1..=count {
        println!("Count is: {i}!");
    }
}

async fn async_main(count: i32) {
    count_to(count).await;
}

fn main() {
    block_on(async_main(10));
}

重要須知:

  • 注意這只是一個簡化過的程式碼,目的是要示範程式語法。這份範例程式碼當中並沒有需要長時間運行的操作,也沒有真正的併行處理!

  • 如何得知非同步函數的回傳型別?

    • main 函數中使用 let feature: () = async_main(10); 以查看型態。
  • The "async" keyword is syntactic sugar. The compiler replaces the return type with a future.

  • 你不能把 main 函數標示成非同步函數,除非你對編譯器額外設定了如何處理回傳的 future 的方式。

  • You need an executor to run async code. block_on blocks the current thread until the provided future has run to completion.

  • .await 會非同步地等待其他操作執行完畢。別於 block_on.await 不會阻塞當前的執行緒。

  • .await can only be used inside an async function (or block; these are introduced later).