Каналы

Канал считается закрытым , если либо передающая, либо принимающая его половина уничтожена.

Библиотека use std::sync::mpsc;

use std::sync::mpsc;

fn main() {
    let (tx, rx) = mpsc::channel();
}

mpsc означает несколько производителей, один потребитель (multiple producer, single consumer).

use std::sync::mpsc;
use std::thread;

fn main() {
    let (tx, rx) = mpsc::channel(); //создали канал с приемником и передатчиком

    thread::spawn(move || { //создали поток и передали в него tx
        let val = String::from("hi");
        tx.send(val).unwrap(); //отправили сообщение в канал
    });

    let received = rx.recv().unwrap(); //получили сообщение из канала
    println!("Got: {received}");
}
  • try_recv — ждет поступления в канал и не блокирует поток
  • recv — блокирует поток до получения сообщения

Получение через итератор

#![allow(unused)]
fn main() {
    for received in rx {
        println!("Got: {received}");
    }

}

Будет получать пока не закроется канал

передатчики можно клонировать

let tx1 = tx.clone();

создавать новые потоки и запускать отправку в канал