Sobes.tech
Junior

Do czego służy WaitGroup w Go?

sobes.tech AI

Odpowiedź od AI

WaitGroup jest używany do synchronizacji pracy jednej lub wielu gorutyn. Pozwala głównej gorutynie oczekiwać na zakończenie innych utworzonych gorutyn. Składa się z licznika, który zwiększa się podczas tworzenia gorutyny i zmniejsza się po jej zakończeniu.

Główne metody:

  • Add(delta int): Zwiększa lub zmniejsza licznik gorutyn.
  • Done(): Zmniejsza licznik o 1. Zazwyczaj wywoływana na końcu gorutyny (często z użyciem defer).
  • Wait(): Blokuje wykonanie do momentu, gdy licznik osiągnie zero.

Przykład użycia:

package main

import (
	"fmt"
	"sync"
)

func worker(id int, wg *sync.WaitGroup) {
	defer wg.Done() // Zmniejsza licznik po zakończeniu gorutyny

	fmt.Printf("Gorutyna %d zaczyna\n", id)
	// Symulacja pracy
	// time.Sleep(time.Second)
	fmt.Printf("Gorutyna %d kończy\n", id)
}

func main() {
	var wg sync.WaitGroup // Tworzymy WaitGroup

	for i := 1; i <= 5; i++ {
		wg.Add(1) // Zwiększamy licznik dla każdej gorutyny
		go worker(i, &wg) // Uruchamiamy gorutynę, przekazując wskaźnik na WaitGroup
	}

	wg.Wait() // Czekamy, aż licznik osiągnie zero (wszystkie gorutyny zakończą)
	fmt.Println("Wszystkie gorutyny zakończone")
}