Sobes.tech
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 con defer).
  • 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")
}