Anuncios

Bienvenido sean a este post, hoy veremos como pasar informacion entre threads.

Anuncios

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.

Anuncios

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
Anuncios

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.

Anuncios

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);
}
Anuncios
Anuncios

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$
Anuncios
Anuncios

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.

Anuncios

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.

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.50