Sobes.tech
Junior

Was ist WaitGroup in Go und wofür wird es verwendet?

sobes.tech KI

Antwort von AI

WaitGroup ist ein Synchronisationsmechanismus in Go, der es ermöglicht, auf das Ende einer Gruppe von Goroutines zu warten.

Es wird verwendet für:

  • Warten, bis alle Goroutines beendet sind, bevor die Funktion oder das Programm beendet wird.
  • Koordination der Arbeit zwischen mehreren Goroutines.

Beispiel für die Verwendung:

package main

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

func worker(id int, wg *sync.WaitGroup) {
	defer wg.Done() // Verringert den Zähler bei Beendigung der Goroutine

	fmt.Printf("Arbeiter %d hat begonnen\n", id)
	time.Sleep(time.Second) // Arbeitssimulation
	fmt.Printf("Arbeiter %d hat beendet\n", id)
}

func main() {
	var wg sync.WaitGroup // Deklariert ein WaitGroup
	numWorkers := 3

	for i := 1; i <= numWorkers; i++ {
		wg.Add(1) // Erhöht den Zähler vor dem Start jeder Goroutine
		go worker(i, &wg)
	}

	wg.Wait() // Blockiert die Ausführung von main, bis der Zähler 0 ist
	fmt.Println("Alle Arbeiter haben beendet")
}

Hauptmethoden:

  • Add(delta int): Erhöht den internen Zähler des WaitGroup um delta. Muss vor dem Start jeder Goroutine aufgerufen werden, die verfolgt werden soll.
  • Done(): Verringert den internen Zähler des WaitGroup um 1. Wird üblicherweise in defer innerhalb der Goroutine aufgerufen, um die Reduktion auch im Falle eines Paniks zu garantieren.
  • Wait(): Blockiert die aktuelle Goroutine, bis der interne Zähler des WaitGroup 0 ist.