đ„ 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.