Junior
A cosa serve WaitGroup in Go?
sobes.tech AI
Risposta dell'AI
WaitGroup viene utilizzato per sincronizzare il lavoro di una o più goroutine. Permette alla goroutine principale di attendere il completamento di altre goroutine create. È costituito da un contatore che aumenta quando si crea una goroutine e diminuisce quando questa termina.
Metodi principali:
Add(delta int): Aumenta o diminuisce il contatore delle goroutine.Done(): Diminuisce il contatore di 1. Viene chiamato generalmente alla fine di una goroutine (spesso condefer).Wait(): Blocca l'esecuzione finché il contatore non diventa zero.
Esempio di utilizzo:
package main
import (
"fmt"
"sync"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done() // Diminuisce il contatore al termine della goroutine
fmt.Printf("Goroutine %d inizia\n", id)
// Simulazione di lavoro
// time.Sleep(time.Second)
fmt.Printf("Goroutine %d termina\n", id)
}
func main() {
var wg sync.WaitGroup // Crea un WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1) // Incrementa il contatore per ogni goroutine
go worker(i, &wg) // Avvia la goroutine, passando il puntatore al WaitGroup
}
wg.Wait() // Attende che il contatore sia zero (tutte le goroutine terminano)
fmt.Println("Tutte le goroutine sono terminate")
}