Junior
Czym jest WaitGroup w Go i do czego służy?
sobes.tech AI
Odpowiedź od AI
WaitGroup to mechanizm synchronizacji w Go, który pozwala oczekiwać na zakończenie grupy gorutyn.
Używa się go do:
- Oczekiwania na zakończenie wszystkich gorutyn przed wyjściem z funkcji lub programu.
- Koordynacji pracy między wieloma gorutynami.
Przykład użycia:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done() // Zmniejsza licznik po zakończeniu gorutyny
fmt.Printf("Pracownik %d rozpoczął pracę\n", id)
time.Sleep(time.Second) // Symulacja pracy
fmt.Printf("Pracownik %d zakończył pracę\n", id)
}
func main() {
var wg sync.WaitGroup // Deklarujemy WaitGroup
numWorkers := 3
for i := 1; i <= numWorkers; i++ {
wg.Add(1) // Zwiększamy licznik przed uruchomieniem każdej gorutyny
go worker(i, &wg)
}
wg.Wait() // Blokuje wykonanie main do momentu, aż licznik nie osiągnie 0
fmt.Println("Wszystkie gorutyny zakończyły pracę")
}
Główne metody:
Add(delta int): Zwiększa wewnętrzny licznikWaitGroupodelta. Powinno się go wywołać przed uruchomieniem każdej gorutyny, którą chcemy śledzić.Done(): Zmniejsza wewnętrzny licznikWaitGroupo 1. Zazwyczaj wywoływane wdeferwewnątrz gorutyny, aby zagwarantować zmniejszenie nawet w przypadku paniki.Wait(): Blokuje bieżącą gorutynę do momentu, aż licznik wewnętrznyWaitGrouposiągnie 0.