Tokio

Tokio は以下を提供します。

  • 非同期コードを実行するためのマルチスレッドランタイム。
  • 標準ライブラリの非同期版。
  • 大規模なライブラリエコシステム。
// 著作権 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0

use tokio::time;

async fn count_to(count: i32) {
    for i in 0..count {
        println!("Count in task: {i}!");
        time::sleep(time::Duration::from_millis(5)).await;
    }
}

#[tokio::main]
async fn main() {
    tokio::spawn(count_to(10));

    for i in 0..5 {
        println!("Main task: {i}");
        time::sleep(time::Duration::from_millis(5)).await;
    }
}
  • tokio::main マクロを使うことで、main を async にできるようになりました。

  • spawn 関数は、新しい並行な「タスク」を作成します。

  • 注: spawnFuture を受け取るため、count_to に対して .await は呼び出しません。

さらに調べてみましょう:

  • なぜ count_to は 10 まで到達しないのでしょうか?これは async キャンセルの例です。 tokio::spawn は、完了まで待機するために await できるハンドルを返します。

  • spawn する代わりに count_to(10).await を試してみてください。

  • tokio::spawn から返されるタスクを await してみてください。