async/await

大まかに言うと、async Rust のコードは「通常の」逐次コードと非常によく似ています:

// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0

use futures::executor::block_on;

async fn count_to(count: i32) {
    for i in 0..count {
        println!("カウントは {i} です!");
    }
}

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

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

要点:

  • これは構文を示すための簡略化された例である点に注意してください。この中には、長時間 実行される処理も、実際の並行性もありません!

  • “async” キーワードはシンタックスシュガーです。コンパイラは戻り値の型を future に置き換えます。

  • 返された future をどのように使うかについてコンパイラへの追加の指示がなければ、 main を async にすることはできません。

  • async コードを実行するにはエグゼキュータが必要です。block_on は、指定された future の実行が完了するまで現在のスレッドをブロックします。

  • .await は別の操作の完了を非同期に待機します。block_on と異なり、 .await は現在のスレッドをブロックしません。

  • .await は async 関数の内部でのみ使用できます(またはブロック内。これらは 後で紹介します)。