Bienvenido sean a este post, hoy veremos como pasar informacion entre threads.
Ya vimos como pasar informacion entre threads mediante el move closure en este post, pero tenemos otra forma por un tipo de accion mas conocida como «pasando mensajes», lo cual nos asegura una mejor concurrencia donde los threads o actores se comunican mediante mensajes los cuales contienen los datos.
Rust nos provee de manera estandar una implementacion para hacer esto llamada channel, para entender mejor el concepto podemos considerar a channel como un canal de agua o rio, al cual si colocamos un elemento (un bote por ejemplo) este avanzara hasta llegar al final de este canal, desde el punto de vista del lenguaje este channel se compone de dos partes:
- Transmisor
- Receptor
Podemos considerar que este canal se divide en dos mitades, la primera sera la transmisora y se encargara de la emision de la informacion, la otra mitad sera la receptora y se encargara de recibir dicha informacion, si todo se realizo correctamente se procedera con el cierre del canal, con esto tenemos la teoria pero vamos a verlo en accion mediante un simple ejemplo.
Para ello crearemos un nuevo proyecto al cual llamaremos canal, una vez creado modificaremos el codigo generado en el archivo main.rs con el siguiente:
main.rs
use std::thread;
use std::sync::mpsc;
fn main()
{
let (tx, rx) = mpsc::channel();
thread::spawn(move || {
let v = String::from("Hola");
tx.send(v).unwrap();
});
let recibido = rx.recv().unwrap();
println!("Recibido: {}", recibido);
}
La primera importacion sera nuestra libreria para los threads, la siguiente sera mpsc, la cual es conocida como Multiple Producer Simple Consumer, y esta sera la encargada de crear los canales para nuestro codigo, para ello definiremos dos variables donde aplicaremos la funcion channel para que se conviertan en los canales, luego crearemos un nuevo thread y moveremos el closure, en este definiremos una nueva variable que tendra una cadena y luego tomamos la variable tx y desde la cual enviaremos por medio de send el valor antes definido, despues definiremos una variable la cual recibira el valor enviado y para ello usaremos el otro canal creado (rx) y por ultimo lo mostraremos en pantalla, compilemos y veamos su salida:
tinchicus@dbn001vrt:~/lenguajes/rust/canal$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target/debug/canal`
Recibido: Hola
tinchicus@dbn001vrt:~/lenguajes/rust/canal$
Como pueden ver se realizo perfectamente el envio entre canales, esto gracias tambien a las funciones send y recv las cuales envian y reciben la informacion respectivamente, obviamente este es un ejemplo muy simple pero esto podria derivar en un sistema de chat o el envio de multiples datos para que puedan ser procesados al mismo tiempo, pero recv tiene una variante llamada try_recv la cual trabaja de forma muy similar pero la diferencia es que uno bloqueara en caso de falla (recv) y el otro no permitiendo que podamos seguir recibiendo informacion.
En resumen, hoy hemos visto el pase de mensajes, que es, un breve ejemplo para entender como trabaja, vimos las partes que la componen, despues hicimos un ejemplo simple donde por medio de un thread enviamos un dato a otro y vimos como recibirlo para finalmente trabajarlo, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
