Sobes.tech
Junior

Ce este WaitGroup în Go și pentru ce se folosește?

sobes.tech AI

Răspuns de la AI

WaitGroup este un mecanism de sincronizare în Go care permite așteptarea finalizării unui grup de goroutines.

Este utilizat pentru:

  • Așteptarea finalizării tuturor goroutines înainte de a ieși din funcție sau program.
  • Coordonarea muncii între mai multe goroutines.

Exemplu de utilizare:

package main

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

func worker(id int, wg *sync.WaitGroup) {
	defer wg.Done() // Scade contorul la finalizarea goroutinei

	fmt.Printf("Lucrătorul %d a început\n", id)
	time.Sleep(time.Second) // Simulare de muncă
	fmt.Printf("Lucrătorul %d a terminat\n", id)
}

func main() {
	var wg sync.WaitGroup // Declarăm WaitGroup
	numWorkers := 3

	for i := 1; i <= numWorkers; i++ {
		wg.Add(1) // Crește contorul înainte de a porni fiecare goroutine
		go worker(i, &wg)
	}

	wg.Wait() // Blochează execuția main până când contorul devine 0
	fmt.Println("Toți lucrătorii au terminat")
}

Metode principale:

  • Add(delta int): Crește contorul intern al WaitGroup cu delta. Trebuie apelat înainte de a porni fiecare goroutine de urmărit.
  • Done(): Scade contorul intern al WaitGroup cu 1. De obicei, se apelează cu defer în interiorul goroutinei pentru a garanta reducerea chiar și în caz de panică.
  • Wait(): Blochează goroutine-ul curent până când contorul intern al WaitGroup devine 0.