Anuncios

Bienvenidos sean a este post, hoy continuaremos con el envio de datos.

Anuncios
Anuncios

Ya hablamos como enviar datos de un thread a otro por medio de un canal en este post y despues vimos como la propiedad (ownership) puede afectarla en este otro post pero hoy nos centraremos en como enviar mas de un valor de un thread a otro, porque tal como vimos en los posts antes citados tenemos un codigo que funciona y cumple su cometido pero no observamos realmente como se hace la transferencia entre los distintos threads, para ello tomaremos el proyecto que vinimos trabajando y lo volveremos a modificar, en todo caso sino lo tienen deben crear uno llamado canal, en este iremos al archivo main.rs y modificaremos el codigo de la siguiente manera:

main.rs

use std::thread;
use std::sync::mpsc;
use std::time::Duration;

fn main() 
{
	let (tx, rx) = mpsc::channel();

	thread::spawn(move || {
		let valores = vec![
			String::from("Hola"),
			String::from("desde"),
			String::from("otro"),
			String::from("thread"),
		];

		for v in valores
		{
			tx.send(v).unwrap();
			thread::sleep(Duration::from_secs(1));
		}
	});

	for recibido in rx
	{
		println!("Recibido: {}", recibido);
	}
}
Anuncios
Anuncios

Este es un codigo muy similar al visto en este post pero con unas sutiles diferencias, la primera sera que agregaremos a Duration para poder generar una demora en el codigo, comentemos las primeras diferencias, la primera sera que cambiamos al string por un vector, en este almacenaremos varios textos, el siguiente paso sera obtener los valores de este vector y para ello usaremos un bucle for donde pasaremos todos los valores y los enviaremos uno por vez pero esta vez generamos una pequeña demora para el envio, nuestro siguiente paso sera usar otro bucle for para trabajar con los valores enviados y a medida que lo recibimos sera mostrado en pantalla, si observan no usamos explicitamente a recv para recibir la informacion, esto es debido al hecho de que no tenemos ninguna demora en nuestro bucle for del main thread, por lo tanto el lenguaje considera que nuestro main thread sera el receptor de lo enviado por el otro thread, compilemos y veamos la salida:

Anuncios

Con esto podemos ver como realmente el receptor espera por cada envio de nuestro transmisor, ahora vamos a tomar el codigo anterior y lo modificaremos de la siguiente manera:

main.rs

use std::thread;
use std::sync::mpsc;
use std::time::Duration;

fn main() 
{
	let (tx, rx) = mpsc::channel();

	let tx1 = mpsc::Sender::clone(&tx);
	thread::spawn(move || {
		let valores = vec![
			String::from("Hola"),
			String::from("desde"),
			String::from("otro"),
			String::from("thread"),
		];

		for v in valores
		{
			tx1.send(v).unwrap();
			thread::sleep(Duration::from_secs(1));
		}
	});

	thread::spawn(move || {
		let valores = vec![
			String::from("otro"),
			String::from("mensaje"),
			String::from("de otro"),
			String::from("thread"),
		];

		for v in valores
		{
			tx.send(v).unwrap();
			thread::sleep(Duration::from_secs(1));
		}
	});

	for recibido in rx
	{
		println!("Recibido: {}", recibido);
	}
}
Anuncios

El codigo es similar al visto anteriormente pero aqui tendremos varias diferencias, analicemos la primera:

let tx1 = mpsc::Sender::clone(&tx);
Anuncios
Anuncios

Esta linea se encargara de crear un clon de la parte que envia, en este caso tx, lo cual definira a la misma como emisora, despues modificamos el bloque emisor anterior para que trabaje con este clon, sera la unica diferencia porque el resto trabaja de la misma forma, enviando varios mensajes de este thread al principal, luego volvemos a crear otro thread y enviaremos otros mensajes pero en este si usaremos a tx en lugar de tx1, con esto tenemos dos threads que enviaran mensajes al principal y este al igual que en el ejemplo anterior solo sera receptora de todas las anteriores, compilemos y veamos su salida:

Anuncios
Anuncios

Como pueden ver funciono aunque esta salida puede variar dependiendo principalmente de nuestro ordenador porque cada uno tiene su forma de procesar a los threads, inclusive les recomiendo jugar con la demora agregando mas segundos para que puedan ver como varia aun mas la forma de procesarlo, con esto ya tenemos una gran vision de como trabajan los canales a la hora de enviar mensajes o datos entre distintos threads.

Anuncios

En resumen, hoy hemos visto como enviar multiples mensajes primero entre dos threads, luego entre mas, hemos visto como es el paso a paso para entenderlo, como el lenguaje en base a algunas conductas define de forma implicita la conducta de los threads, 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
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50