別のスレッドにメッセージを送る(@Rust)

現在のRustは非同期処理は得意な分野で(OS開発にも使われるぐらいだから当然)、非同期処理だけで書籍があるぐらい奥も深い

ここでは単純に別のスレッドにメッセージを送ることだけをやってみた

Rustではスレッド間通信はクロージャーを使うようで、rust-lang.orgのサンプルコードを多少変えています

//
// https://doc.rust-lang.org/std/thread/fn.spawn.html
//
use std::thread;
use std::sync::mpsc::channel;
use std::time::Duration;

fn main() {
    // チャネルを作成
    let (tx, rx) = channel();

    // レシーバースレッドをspawn
    let _receiver = thread::spawn(move || {
        let value: String = rx.recv().expect("Unable to receive from channel");
        rcv(value.clone());
    });

    // センダースレッドをspawn
    let _sender = thread::spawn(move || {
        tx.send("Hello, thread".to_owned())
            .expect("Unable to send on channel");
    });

    // センダースレッドの終了を待つ
    //sender.join().expect("The sender thread has panicked");

    // レシーバースレッドの終了を待つ(但し、rcv関数の終了を待たない)
    //receiver.join().expect("The receiver thread has panicked");

    println!("reach to the end");
    thread::sleep(Duration::from_secs_f32(1.5));
}

fn rcv(value: String) {
    thread::sleep(Duration::from_secs_f32(1.0));
    println!("recieved : {}", value);
}

このコードではsenderもreceiverも終了を待たないようにしていますが、その場合にはrcv関数の方が時間が遥かにかかるので、main関数の最後の時間待ちがないとrev()の実行は途中で打ち切られます

今回のケースでは相互にデータをやり取りや完了を待つわけではなく、main関数からrcv関数にメッセージを送りたいだけなのでこのような構成で十分です

さらに言えば、senderスレッドを別に起こさなくとも直接tx.send()を実行しても構いません

もし完全に非同期処理が必要ならばasync/awaitの出番ですが、これはgolangと結構類似しているように思います

 

admin

カテゴリーRust

コメントを残す