Concurrencia#

Logo GO

Concurrencia en GO o como trabajar en multihilo.

Creación de goRoutines y Channels#

Las goRoutines se utilizan para ejecutar funciones en distintos hilos de manera que pueda ejecutarse el código de forma paralela y no tener que esperar a que acabe una rutina para comenzar otra.

Ejecución sin concurrencia#

 1package main
 2
 3import (
 4    "fmt"
 5    "log"
 6    "net/http"
 7)
 8
 9func revisar(servidor string) {
10    _, err := http.Get(servidor)
11
12    if err != nil {
13        log.Fatal(err)
14    }
15
16    fmt.Println(servidor, "en ejecución")
17}
18
19func main() {
20    servidores := []string{
21        "https://altiplaconsulting.com",
22        "https://youtube.com",
23        "https://google.com",
24        "https://piptonita.com",
25    }
26
27    for _, servidor := range servidores {
28        revisar(servidor)
29    }
30
31}

Ejecución con concurrencia#

 1package main
 2
 3import (
 4    "fmt"
 5    "log"
 6    "net/http"
 7)
 8
 9// la función recibirá el canal que se ha creado:
10func revisar(servidor string, canal chan string) {
11    _, err := http.Get(servidor)
12
13    if err != nil {
14        log.Fatal(err)
15    }
16
17    // como ya no va a imprimir el mensaje se ejecuta del siguiente modo:
18    canal <- servidor + " en ejecución"
19}
20
21func main() {
22    // para leer los resultados se crea un canal:
23    canal := make(chan string)
24
25    servidores := []string{
26        "https://altiplaconsulting.com",
27        "https://youtube.com",
28        "https://google.com",
29        "https://piptonita.com",
30    }
31
32    for _, servidor := range servidores {
33        // para activar la concurrencia añadimos go para que analice todos los servidores a la vez:
34        go revisar(servidor, canal) // le pasamos también el canal
35    }
36
37    // ahora se crea otro bucle for para retornar lo que está devolviendo los canales:
38    for i := 0; i < len(servidores); i++ {
39        // se imprime el canal:
40        fmt.Println(<-canal)
41    }
42
43}

Nota

Se puede comprobar en el resultado de cada código que con la concurrencia ha devuelto las páginas en distinto orden ya que las mostró nada más terminar de ejecutarlas.