18.2 Channels
Rust가 제공하는 비동기식 채널(channels)
은 쓰레드들 간의 통신을 위한 것이다. 채널로 허용되는 단방향 정보 흐름의 양 끝단은: Sender
와 Receiver
이다.
use std::sync::mpsc::{Sender, Receiver}; use std::sync::mpsc; use std::thread; static NTHREADS: i32 = 3; fn main() { // 채널은 양 끝단을 갖는다: `Sender` 와 `Receiver `, // `T`는 전송될 메시지의 타입 // (타입 주해는 필요치 않다) let (tx, rx): (Sender<i32>, Receiver<i32>) = mpsc::channel(); for id in 0..NTHREADS { // 수신종단은 복사될 수 있다. let thread_tx = tx.clone(); // 각 쓰레드는 채널을 통해 그들의 id를 보내게 된다. thread::spawn(move || { // 쓰레드는 `thread_tx`를 통해 소유권을 취한다. // 각 쓰레드는 채널에서 오는 메시지를 기다린다. thread_tx.send(id).unwrap(); // 보내기는 논-블로킹 동작이고, 쓰레드는 메시지를 보내지마자 // 다음 수행으로 넘어갈 것이다. println!("thread {} finished", id); }); } // 여기서, 모든 메시지들이 수집된다. let mut ids = Vec::with_capacity(NTHREADS as usize); for _ in 0..NTHREADS { // `recv` 메소드는 채널에서 메시지를 집어온다. // `recv` 는 현재 쓰레드가 메시지를 받지 못하면 블럭된다. ids.push(rx.recv()); } // 어떤 메시지가 보내졌는지를 통해 순서를 보자. println!("{:?}", ids); }