go / intermediate
Snippet
Koordinierung mehrerer Goroutines mit sync.WaitGroup
Das sync.WaitGroup wird verwendet, um den Ausführungsfluss zu koordinieren, wenn mehrere nebenläufige Aufgaben in separaten Goroutines gestartet werden. Durch den Aufruf von Add(1) vor dem Start einer Goroutine und Done() bei deren Beendigung verwalten wir einen Zähler aktiver Routinen. Wait() blockiert die Ausführung, bis dieser Zähler auf Null sinkt, was garantiert, dass der nachfolgende Code erst ausgeführt wird, wenn alle Aufgaben abgeschlossen sind.
snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package mainimport ("fmt""sync""time")func performTask(taskID int, wg *sync.WaitGroup) {defer wg.Done()fmt.Printf("Starting task %d\n", taskID)time.Sleep(100 * time.Millisecond)fmt.Printf("Finished task %d\n", taskID)}func coordinateTasks() {var wg sync.WaitGroupfor i := 1; i <= 3; i++ {wg.Add(1)go performTask(i, &wg)}wg.Wait()fmt.Println("All concurrent tasks completed successfully.")}
Erklärung
1
var wg sync.WaitGroup
Deklariert eine Group-Variable, die den internen Zähler der Goroutines enthält, auf die gewartet werden soll.
2
wg.Add(1)
Erhöht den WaitGroup-Zähler. Dies muss in der Haupt-Goroutine ausgeführt werden, bevor die Unter-Goroutine gestartet wird.
3
defer wg.Done()
Stellt sicher, dass der Zähler dekrementiert wird, wenn die Goroutine endet, selbst bei vorzeitigem Beenden.
4
wg.Wait()
Blockiert den aktuellen Ausführungsblock, bis der interne WaitGroup-Zähler Null erreicht.