Heim >Backend-Entwicklung >Golang >Wie verwende ich sync.WaitGroup, um alle Goroutinen auszuführen?
PHP-Editor Apple stellt Ihnen eine praktische Methode zum Ausführen aller Goroutinen vor – sync.WaitGroup. In der Go-Sprache ist Goroutine ein leichter Thread, der mehrere Aufgaben gleichzeitig ausführen kann. Manchmal müssen wir jedoch warten, bis alle Goroutinen abgeschlossen sind, bevor wir mit dem nächsten Schritt fortfahren. Zu diesem Zeitpunkt ist sync.WaitGroup praktisch. Es bietet eine einfache und effektive Möglichkeit, auf den Abschluss aller Goroutinen zu warten und so die korrekte Ausführungsreihenfolge des Programms sicherzustellen. Als Nächstes stellen wir detailliert vor, wie sync.WaitGroup zum Implementieren dieser Funktion verwendet wird.
Derzeit schiebe ich alle Werte auf einen Kanal und lese daraus und berechne ihr Quadrat.
Ich möchte die Verwendung von time.sleep(2000 * time.millisecond)
vermeiden, da es die Ausführung für 2 Sekunden blockiert. Stattdessen möchte ich, dass jede Goroutine verarbeitet wird, auf ihre Ausführung wartet und dann das Programm beendet. Ich bin gerade von Golang weggezogen und stelle jetzt diese grundlegende Frage :(. Kann mir jemand bei der Lösung dieses Problems helfen?
package main import ( "fmt" "sync" "time" ) func doSquare(num int) int { return num * num } var wg sync.WaitGroup func main() { wg.Add(1) st := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} quit := make(chan bool) ch := make(chan int) go func() { for i := range st { ch <- i } }() go func() { for { select { case x := <-ch: fmt.Println(doSquare(x)) // return case <-quit: wg.Done() default: // fmt.Println("---") // do something } } }() quit <- true wg.Wait() time.Sleep(2000 * time.Millisecond) }
Gehen Sie einfach quit zum Ende der ersten Goroutine
func main() { wg.add(1) st := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} quit := make(chan bool) ch := make(chan int) go func() { for i := range st { ch <- i } quit <- true }() go func() { for { select { case x := <-ch: fmt.println(dosquare(x)) // return case <-quit: wg.done() return default: // fmt.println("---") // do something } } }() wg.wait() }
Das ist close(ch)
eine andere Art zu sagen, dass es keine Daten mehr gibt
func main() { st := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} quit := make(chan bool) ch := make(chan int) // improve concurrency by `ch := make(chan int, 100)` go func() { for i := range st { ch <- i } close(ch) }() go func() { for x := range ch { fmt.Println(doSquare(x)) } quit <- true }() <-quit }
Das obige ist der detaillierte Inhalt vonWie verwende ich sync.WaitGroup, um alle Goroutinen auszuführen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!