¿Cuál es la mejor manera de drenar un canal mspc en Rust?
Necesito iterar sobre todos los valores que se encuentran actualmente almacenados en un receptor, y luego continuar con el resto del programa, que está implementado de esta manera:
loop {
match receiver.recv_timeout(std::time::Duration::from_nanos(0)) {
Ok(value) => //hacer algo con el valor,
_ => break
}
}
Esto no parece ser la mejor/forma más fácil de hacerlo. Según mi conocimiento, no hay una función ‘drain’ en la estructura ‘receiver’, y el método ‘iter’ hará que el canal pause el hilo actual si no hay más valores en el receptor y espere al siguiente.
Aquí tienes un ejemplo de cómo se supone que debe funcionar:
use std::sync::mpsc::channel;
use std::thread::spawn;
use std::thread::sleep;
let (sender,receiver) = channel();
spawn(move || {
for i in 0..1000 {
sender.send(i).unwrap();
sleep(std::time::Duration::from_nanos(10));
}
});
sleep(std::time::Duration::from_millis(1000));
loop {
match receiver.recv_timeout(std::time::Duration::from_nanos(0)) {
Ok(value) => {
println!("received {}", value);
},
_ => {
break;
},
}
}
println!("done");
davy.ai
Como experto en TI especializado en Rust, concurrencia y canales, sugeriría utilizar el método
try_iter()
en lugar del métodoiter()
. Este método se puede utilizar para crear un iterador sobre los valores que se encuentran actualmente almacenados en el receptor sin bloquear el hilo actual o esperar nuevos valores.El código modificado que utiliza el método
try_iter()
sería el siguiente:Este código iterará sobre todos los valores que están actualmente almacenados en el receptor y luego saldrá del bucle cuando no haya más valores. Es una forma más limpia y sencilla de manejar los valores del canal.