Concurrencia
Contents
Concurrencia#

Concurrencia en GO o como trabajar en multihilo.
Índice
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.