Rustで非同期処理を行うために、tokio
クレートを使用してワーカースレッドを起動する方法を説明します。以下に示すサンプルコードでは、tokio::runtime::Builder
を使用してワーカースレッドを4つ作成し、それぞれで異なる待機時間のあとに終了するタスクを実行しています。
use tokio::runtime::Builder;
use tokio::runtime::Runtime;
use tokio::try_join;
fn main() {
let local_runtime = Runtime::new().unwrap();
let runtime = Builder::new_multi_thread()
.worker_threads(4) // 4つのワーカースレッドを使用するように指定
.enable_all()
.build()
.unwrap();
println!("Main thread started");
let thread1 = runtime.spawn(async {
println!("Thread 1 started");
// 1秒待つ
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
println!("Thread 1 finished");
});
let thread2 = runtime.spawn(async {
println!("Thread 2 started");
// 2秒待つ
tokio::time::sleep(std::time::Duration::from_secs(2)).await;
println!("Thread 2 finished");
});
let thread3 = runtime.spawn(async {
println!("Thread 3 started");
// 3秒待つ
tokio::time::sleep(std::time::Duration::from_secs(3)).await;
println!("Thread 3 finished");
});
println!("Main thread finished");
// 3つのスレッドが終わるのを待ち合わせる
local_runtime.block_on(async {
let results = try_join!(thread1, thread2, thread3);
match results {
Ok(_) => println!("All tasks have completed."),
Err(e) => println!("An error occurred while waiting for tasks: {:?}", e),
}
});
}
解説
-
クレートを用意する:
tokio::runtime::Builder
とtokio::runtime::Runtime
(プログラムで使用されるクレート)をインポートしています。 -
ランタイムを作成する:
Runtime::new()
とBuilder::new_multi_thread()
を使用して、それぞれlocal_runtime
とruntime
を作成しています。runtime
では、.worker_threads(4)
でワーカースレッド数を指定し、.enable_all()
ですべての機能を利用できるように設定しています。 -
main
関数内でメインスレッドが開始され、その後ワーカースレッドが次々と開始されます。 -
各ワーカースレッドが別々の経過時刻で終了します(Thread 1は1秒後、Thread 2は2秒後、Thread 3は3秒後)。
-
最後に、メインスレッドが終了し、
local_runtime.block_on
で全てのワーカースレッドが終了されたことを確認しています。結果がOk
であれば、すべてのタスクが終了したことを示し、Err
であればエラー発生時の理由を表示します。
このサンプルコードを実行すると、指定された待機時間が経過した後に、各ワーカースレッドが次々と終了し、全てのタスクが終了したことが表示されます。これにより、Rustのtokioを使用してワーカースレッドを起動し、非同期処理を行う方法を学ぶことができます。