🥇 Utilizando multiples rutinas.

Supongamos ahora que deseamos leer el contenido de multiples 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 asi..

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
}

Despues 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 despues 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 multiples ocasiones, dependiendo de la velocidad de respuesta de cada uno de los RSS, el orden será distinto, al igual que el tiempo de respuesta.

Gorutinas Golang vs NodeJS vs Java.
comments powered by Disqus