Junior
Cos'è WaitGroup in Go e a cosa serve?
sobes.tech AI
Risposta dell'AI
WaitGroup è un meccanismo di sincronizzazione in Go che permette di attendere il completamento di un gruppo di goroutine.
Viene utilizzato per:
- Attendere che tutte le goroutine terminino prima di uscire dalla funzione o dal programma.
- Coordinare il lavoro tra più goroutine.
Esempio di utilizzo:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done() // Diminuisce il contatore al termine della goroutine
fmt.Printf("Lavoratore %d ha iniziato\n", id)
time.Sleep(time.Second) // Simulazione di lavoro
fmt.Printf("Lavoratore %d ha finito\n", id)
}
func main() {
var wg sync.WaitGroup // Dichiarazione di WaitGroup
numWorkers := 3
for i := 1; i <= numWorkers; i++ {
wg.Add(1) // Incrementa il contatore prima di lanciare ogni goroutine
go worker(i, &wg)
}
wg.Wait() // Blocca l'esecuzione di main fino a quando il contatore non diventa 0
fmt.Println("Tutti i lavoratori hanno finito")
}
Metodi principali:
Add(delta int): Aumenta il contatore interno diWaitGroupdidelta. Deve essere chiamato prima di lanciare ogni goroutine da monitorare.Done(): Diminuisce il contatore interno diWaitGroupdi 1. Di solito viene chiamato condeferall'interno della goroutine per garantire la riduzione anche in caso di panico.Wait(): Blocca la goroutine corrente fino a quando il contatore interno diWaitGroupnon diventa 0.