es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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");
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en Rust, concurrencia y canales, sugeriría utilizar el método try_iter() en lugar del método iter(). 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:

    loop {
        match receiver.try_iter().next() {
            Some(value) => {
                // hacer algo con el valor
            },
            None => {
                break;
            },
        }
    }
    

    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.

Comments are closed.