Having multiple receivers listening to the same sender in Rust?

For anyone later looking how to do this with crossbeam_channel :

use std::thread::{spawn, sleep};
use std::time::Duration;
use crossbeam_channel::{unbounded, Sender, Receiver};

fn main() {
    let (tx1, rx1) = unbounded();
    let (tx2, rx2) = unbounded();
    for i in 0..3 {
        let tx1 = tx1.clone();
        let rx2 = rx2.clone();
        spawn(move || consumer(i, tx1,rx2));
    }
    let vec_int:Vec<u64>=vec![3,1,2,2,1,3,4,4,2];
    spawn(move || producer(vec_int,rx1,tx2));
    loop {}
}

fn consumer(thread: i32, request: Sender<bool>, response: Receiver<u64>) {
    let mut receive_counter=3;
    loop {
        request.send(true).unwrap();
        let r =response.recv().unwrap();
        println!("Thread {} received {}",thread,r);
        receive_counter-=1;
        if receive_counter==0 {
            println!("Thread {} is done!", thread);
            break;
        }else {
            sleep(Duration::from_secs(r))
        }
    }
}

fn producer(mut vec_u64: Vec<u64>, request: Receiver<bool>, response: Sender<u64>) {
    loop{
        match request.try_recv(){
            Ok(_) => {
                let send_val= vec_u64.swap_remove(0);
                response.send(send_val).unwrap();
                if vec_u64.len()==0{
                    println!("Finishing producing");
                    break;
                }
            }
            _ => {

            }
        }
    }
}
2 Likes