Hilos, Canales y multitarea en Go

Hace unos días vimos como implementar hilos en en Go, el articulo anterior puedes verlo aquí Hilos y multitarea en Go ,hoy vamos a tomar ese mismo código y mejorarlo para hacerlo más eficiente y  adaptarlo para usar canales.

¿Que son los canales?

Cuando creamos un hilo hijo la ejecución de el hilo se separa de la ejecución principal y si necesitamos devolver datos o información a la ejecución principal una vez que el hilo termina la mejor manera de hacerlo es mediante canales, osea que en criollo un canal es un medio de comunicación entre el hilo y el programa principal.

package main

import "fmt"
import "time"
import "math/rand"

const num_threads = 20

func main() {

    channels := make(chan string,num_threads)

    //Creamos los hilos de la funcion
    for i := 0; i < num_threads; i++ {
        go thread(i,channels)
    }

    count := 0

    for elem := range channels {

        if count == num_threads - 1 {
            close(channels)        
        }

        count++
        fmt.Println(elem)
    }
}


func thread(index int,channels chan string) {

    //Para simular una carga de trabajo
    //dormimos el programa x cantidad de segundo
    //donde x puede ir de x a 100
    var seconds int
    seconds = rand.Intn(100)
    time.Sleep(time.Duration(seconds) * time.Second)

    strings := fmt.Sprintf("%s%d%s%d%s", "Este es el hilo numero ", index, " (", seconds ,"s)")

    channels <- strings
}

Conclusión

Como vimos es sumamente fácil de implementar y tiene una ventaja importante, en el articulo anterior veíamos como luego de lanzar todos los hilos al final del programa principal debíamos hacer una pausa, porque se lanzaban los hilos y el programa continuaba, si se llegaba al final del programa principal el programa terminaba sin esperar a que los hilos terminarán por eso había que hacer tiempo. En este caso el programa no finaliza hasta que todos los hilos respondan a su respectivo canal lo cual es sumamente útil porque no se espera demasiado tiempo ni tampoco menos del necesario, el programa finaliza cuando tiene que hacerlo porque todos los hilos terminaron

 

Alvaro DeLeon

Acerca de Alvaro DeLeon

Administrador de Sistemas,Programador,Docente y Blogger. Más de 20 años de experiencia en computación. Escribo más que nada sobre Linux, sistemas operativos, virtualización, seguridad y tecnología en general además de algunos artículos con opiniones muy personales e irrelevantes.
Esta entrada fue publicada en Desarrollo, Go y etiquetada , , , , . Guarda el enlace permanente.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *