Sobes.tech
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 licznik WaitGroup o delta. Powinno się go wywołać przed uruchomieniem każdej gorutyny, którą chcemy śledzić.
  • Done(): Zmniejsza wewnętrzny licznik WaitGroup o 1. Zazwyczaj wywoływane w defer wewnątrz gorutyny, aby zagwarantować zmniejszenie nawet w przypadku paniki.
  • Wait(): Blokuje bieżącą gorutynę do momentu, aż licznik wewnętrzny WaitGroup osiągnie 0.