1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Rustのtokioでワーカースレッドを起動する方法

Posted at

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

解説

  1. クレートを用意する: tokio::runtime::Buildertokio::runtime::Runtime(プログラムで使用されるクレート)をインポートしています。

  2. ランタイムを作成する: Runtime::new()Builder::new_multi_thread()を使用して、それぞれlocal_runtimeruntimeを作成しています。runtimeでは、.worker_threads(4)でワーカースレッド数を指定し、.enable_all()ですべての機能を利用できるように設定しています。

  3. main 関数内でメインスレッドが開始され、その後ワーカースレッドが次々と開始されます。

  4. 各ワーカースレッドが別々の経過時刻で終了します(Thread 1は1秒後、Thread 2は2秒後、Thread 3は3秒後)。

  5. 最後に、メインスレッドが終了し、local_runtime.block_onで全てのワーカースレッドが終了されたことを確認しています。結果がOkであれば、すべてのタスクが終了したことを示し、Errであればエラー発生時の理由を表示します。

このサンプルコードを実行すると、指定された待機時間が経過した後に、各ワーカースレッドが次々と終了し、全てのタスクが終了したことが表示されます。これにより、Rustのtokioを使用してワーカースレッドを起動し、非同期処理を行う方法を学ぶことができます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?