đŸ„‡ Utilizando mĂșltiples rutinas

🍿 ÂżCĂłmo utilizar mĂșltiples rutinas en Go?

Supongamos ahora que deseamos leer el contenido de mĂșltiples archivos xml de rss feeds. En este caso nuestro lector tiene una lista con 5 direcciones url.

ESPN. http://www.espn.com/espn/rss/news

NY Times http://rss.nytimes.com/services/xml/rss/nyt/World.xml

Wall Street Journal https://feeds.a.dj.com/rss/RSSWorldNews.xml

Nuestro cĂłdigo luce asĂ­..

package main

import (
    "fmt"
    "net/http"
    "time"
)

type RSS struct {
    Nombre string
    Url    string
}

func (rss *RSS) leer() {
    t1 := time.Now()
    resp, err := http.Get(rss.Url)
    if err != nil {
        fmt.Println(err)
    }
    defer resp.Body.Close()
    t2 := time.Since(t1).Seconds()
    fmt.Println(rss.Nombre, "lectura completada en", t2, "segundos")
}

func main() {
    listaRSS := []*RSS{
        &RSS{Nombre: "ESPN", Url: "http://www.espn.com/espn/rss/news"},
        &RSS{Nombre: "NY Times", Url: "http://rss.nytimes.com/services/xml/rss/nyt/World.xml"},
        &RSS{Nombre: "Wall Street Journal", Url: "https://feeds.a.dj.com/rss/RSSWorldNews.xml"},
    }
    for _, rss := range listaRSS {
        go rss.leer()
    }
    time.Sleep(time.Second * 6)
}

Primero utilizamos una estructura que contiene el nombre y la direcciĂłn url de nuestro RSS.

type RSS struct {
    Nombre string
    Url    string
}

Después agregamos un método a nuestra estructura que permite leer dicha url haciendo uso del paquete http, y calcula el tiempo que existe entre la petición y la respuesta del servidor, para después finalmente imprimir los detalles.

func (rss *RSS) leer() {
    t1 := time.Now()
    resp, err := http.Get(rss.Url)
    if err != nil {
        fmt.Println(err)
    }
    defer resp.Body.Close()
    t2 := time.Since(t1).Seconds()
    fmt.Println(rss.Nombre, "lectura completada en", t2, "segundos")
}

Para almacenar todas las estructuras hemos creado un slice que contiene 3 de ellas.

listaRSS := []*RSS{
    &RSS{Nombre: "ESPN", Url: "http://www.espn.com/espn/rss/news"},
    &RSS{Nombre: "NY Times", Url: "http://rss.nytimes.com/services/xml/rss/nyt/World.xml"},
    &RSS{Nombre: "Wall Street Journal", Url: "https://feeds.a.dj.com/rss/RSSWorldNews.xml"},
}

Finalmente recorremos el slice, y para cada uno de las estructuras invocamos el método leer() que realiza la lectura para cada una de ellas.

for _, rss := range listaRSS {
    go rss.leer()
}
time.Sleep(time.Second * 6)

En la salida podemos ver que tenemos diferentes valores para cada una de las rutinas, el tiempo total de ejecuciĂłn es muy cercano al mĂĄximo de las tres.

NY Times lectura completada en 0.056710012 segundos
ESPN lectura completada en 0.079235882 segundos
Wall Street Journal lectura completada en 0.4200502 segundos

Si se ejecuta el script en mĂșltiples ocasiones, dependiendo de la velocidad de respuesta de cada uno de los RSS, el orden serĂĄ distinto, al igual que el tiempo de respuesta.