Sobes.tech
Junior

Qu'est-ce que WaitGroup en Go et à quoi sert-il?

sobes.tech IA

Réponse de l'IA

WaitGroup est un mécanisme de synchronisation en Go qui permet d'attendre la fin d'un groupe de goroutines.

Il est utilisé pour:

  • Attendre que toutes les goroutines se terminent avant de sortir de la fonction ou du programme.
  • Coordonner le travail entre plusieurs goroutines.

Exemple d'utilisation:

package main

import (
	"fmt"
	"sync"
	"time"
)

func worker(id int, wg *sync.WaitGroup) {
	defer wg.Done() // Diminue le compteur à la fin de la goroutine

	fmt.Printf("Travailleur %d a commencé\n", id)
	time.Sleep(time.Second) // Simulation de travail
	fmt.Printf("Travailleur %d a terminé\n", id)
}

func main() {
	var wg sync.WaitGroup // Déclare un WaitGroup
	numWorkers := 3

	for i := 1; i <= numWorkers; i++ {
		wg.Add(1) // Augmente le compteur avant de lancer chaque goroutine
		go worker(i, &wg)
	}

	wg.Wait() // Bloque l'exécution de main jusqu'à ce que le compteur atteigne 0
	fmt.Println("Tous les travailleurs ont terminé")
}

Méthodes principales:

  • Add(delta int): Augmente le compteur interne de WaitGroup de delta. Doit être appelé avant de lancer chaque goroutine à suivre.
  • Done(): Diminue le compteur interne de WaitGroup de 1. Généralement appelé dans defer à l'intérieur de la goroutine pour garantir la réduction même en cas de panic.
  • Wait(): Bloque la goroutine en cours jusqu'à ce que le compteur interne de WaitGroup atteigne 0.