Golang WaitGroup

Golang WaitGroup
Mit Golang WaitGroup können Sie einen bestimmten Codeblock blockieren, damit ein Satz von Goroutinen die Ausführung abschließen kann. Ein Beispiel wäre, die Hauptfunktion zu blockieren, bis die Goroutinen abgeschlossen sind, und dann die Gruppe entsperren.

Beispiel 1

Nehmen Sie unten ein Beispiel:

Paket Main
importieren "fmt"
funcrt ()
fmt.Println ("Erste Go -Routine")

funcrt2 ()
fmt.Println ("zweite Go -Routine")

funcmain ()
Go rt ()
Go rt2 ()

Wenn Sie den obigen Code ausführen, druckt das Programm nichts aus. Dies liegt daran, dass die Hauptfunktion beim Start der Goroutinen beendet wird. Da die Hauptfunktion der Einstiegspunkt eines GO -Programms ist, endet das Programm, sobald sie beendet ist.

Um einen solchen Fall zu bewältigen, können wir Golang WaitGroup verwenden. Die WaitGroup -Methode hat drei Hauptmethoden:

  1. Add () - Die Kellnergruppe fungiert als Zähler, der die Anzahl der Funktionen oder Go -Routinen zum Warten hält. Wenn der Zähler 0 wird, veröffentlicht die Karteigruppe die Goroutinen. Wir verwenden die Methode hinzufügen, um dem Kartentisch einen bestimmten Wert hinzuzufügen.
  2. Warten Sie () - Die Wartemethode blockiert die Ausführung, bis die Karteigruppe Zähler 0 wird.
  3. Done () - verringert den Kartentisch um einen Wert von 1

Lassen Sie uns nun das vorherige Beispiel neu erstellen und verwenden Sie die WaitGroup, um die Ausführung zu pausieren.

Paket Main
importieren (
"fmt"
"Synchronisation"
)
Funcrt (WG *Synchronisierung.WaitGroup)
fmt.Println ("Erste Go -Routine")
Aufhebung.Done () // Goroutine aus der Karteigruppe entfernen

Funcrt2 (WG *Sync.WaitGroup)
fmt.Println ("zweite Go -Routine")
Aufhebung.Erledigt()

funcmain ()
// neue Karteigruppe
WG: = neu (Synchronisierung.Wartegruppe)
// zwei Go -Routinen hinzufügen
wg.(2) hinzufügen
Go RT (WG)
Go Rt2 (WG)
// Ausführung blockieren, bis es fertig ist
wg.Warten()

Wenn wir den Code jetzt erneut ausführen, sollten wir eine Ausgabe als:

$ go run WaitGroup.gehen
Zweite Go -Routine
Zuerst Routine gehen

Beispiel 2

Sie können auch Kellner mit anonymen Funktionen verwenden. Ein Beispiel ist wie unten gezeigt:

Paket Main
importieren (
"fmt"
"Synchronisation"
)
wg.Erledigt()
//
funcmain ()
varwgsync.WaitGroup
fei: = 1; ich<= 5; i++
wg.(1) hinzufügen
i: = ich
gofunc ()
Aufhebung.Erledigt()
fmt.Printf ("Startroutine: %d \ n", i)
())

wg.Warten()

Das obige Beispiel zeigt, wie Kartenträger mit einer anonymen Funktion verwendet werden können. Der obige Code sollte zurückgeben:

Startroutine: 1
Startroutine: 3
Startroutine: 4
Startroutine: 5
Startroutine: 2

Abschluss

In diesem Artikel haben wir die Grundlagen der Arbeit mit dem WaitGroup -Unterpackung aus dem Sync -Paket in Go behandelt. Mit WardGroups können Sie die Ausführung pausieren, bis eine Gruppe von Funktionen oder Goroutinen ausgeführt wird.