現在の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