Rustでtokioによる並列処理でcore_threadsのブロックを確認する

並列処理を行ってみた。core_threadsで8スレッドを指定している。定義しているタスク中のsleepcore_threadsをブロックするため、同時に稼働できるタスクは8タスクまで。このコードの結果は偶数値が先に完了した後に、奇数値があとから完了し、それらの完了をもって end が出力される。タスク数が8以上となってくると完了するタスクの結果はそのようにならないことを検証できます。

Cargo.toml

[package]
name = "tokio-test"
version = "0.1.0"
authors = ["hoge"]
edition = "2018"

[dependencies]
tokio = "0.2.0-alpha.5"
tokio-timer = "0.3.0-alpha.5"
runtime-tokio = "0.3.0-alpha.6"
futures-preview = { version = "=0.3.0-alpha.18", features = ["compat"] }

main.rs

#![allow(stable_features)]
#![feature(async_await, async_closure)]

use tokio_timer::clock::Clock;
use std::time::Duration;

fn main() {

    let tokio_runtime = tokio::runtime::Builder::new()
        .core_threads(8) // デフォルトはシステムで使用可能なコア数
        .blocking_threads(80) // ブロッキングするセクションの最大数 (デフォルト100)
        .keep_alive(Some(Duration::from_secs(30))) // 指定しない場合ワーカースレッドは永久に待機する
        .clock(Clock::system()) // Clockランタイムが仕様するインスタンス
        .name_prefix("hoge-tokio-") // デフォルトはtokio-runtime-worker-で識別用に自由に変更可能
        .stack_size(10 * 1024 * 1024)  // ワーカースレッドのスタックサイズ10M
        .build()
        .unwrap();

    (1..=8).for_each(|i| {
        tokio_runtime.spawn(async move {
            std::thread::sleep(std::time::Duration::from_secs(i%2));
            println!("test {}", i)
        });
    });

    tokio_runtime.shutdown_on_idle();

    println!("end");
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA