Sobes.tech
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 di WaitGroup di delta. Deve essere chiamato prima di lanciare ogni goroutine da monitorare.
  • Done(): Diminuisce il contatore interno di WaitGroup di 1. Di solito viene chiamato con defer all'interno della goroutine per garantire la riduzione anche in caso di panico.
  • Wait(): Blocca la goroutine corrente fino a quando il contatore interno di WaitGroup non diventa 0.