14 - Goroutines & sync.WaitGroup
Goroutines
Les goroutines sont des fonctions qui s’exécutent en concurrence avec d’autres et dans le même espace d’adresse. Elles permettent, par exemple, de lancer plusieurs requêtes HTTP en concurrence et de ne pas avoir à attendre qu’une requête HTTP se termine pour en lancer une autre.
Channels
Les channels sont des moyens de communication et de synchronisation entre les goroutines. Autrement dit, elles permettent de « transmettre » des données (int, string, struct…) entre des fonctions concurrentes (goroutines).
sync.WaitGroup
WaitGroup est une primitive de synchronisation de goroutines proposé dans le package sync de la libraire Golang. Elle propose trois méthodes Add, Done et Wait qui permettent de, respectivement: incrémenter le nombre de goroutine à attendre, décrémenter le nombre de goroutines à attendre et bloquer l’exécution du code jusqu’à ce que le nombre de goroutines à attendre arrive à 0.
Le code source présenté dans cet épisode :
package main
import (
"fmt"
"io/ioutil"
"net/http"
"time"
)
var wg sync.WaitGroup
func fetch(url string) {
defer wg.Done()
start_time := time.Now()
resp, err := http.Get(url)
end_time := time.Since(start_time)
if err != nil {
fmt.Println(err)
return
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
fmt.Printf("Site : %s | Length :%d | Processing time : %s \n", url, len(body), end_time)
}
func main() {
fmt.Println("Hello gophers")
urls := []string{"https://wikipedia.org", "https://goolge.com",
"https://facebook.com", "http://exemple.com"}
size := len(urls)
wg.Add(size)
for _, url := range urls {
go fetch(url)
}
wg.Wait()
}