Heim >Backend-Entwicklung >Golang >So beenden Sie eine Coroutine in Golang
Goroutine und Channel sind großartige Funktionen der Go-Sprache. Sie bieten eine sehr leichte und benutzerfreundliche Parallelitätsfunktion. Aber wie kann man warten, bis alle Goroutinen im Hauptprozess beendet sind, wenn es in Ihrem Bewerbungsprozess viele Goroutinen gibt?
1 Leiten Sie das Ausgangssignal durch den Kanal (Empfohlenes Lernen: GO )
Die große Designphilosophie von GO lautet: Daten über den Kanal teilen und während Daten nicht über den gemeinsamen Speicher geteilt werden. Der Hauptprozess kann über den Kanal ein Stoppsignal an jede Goroutine senden, wie folgt:func run(done chan int) { for { select { case <-done: fmt.Println("exiting...") done <- 1 break default: } time.Sleep(time.Second * 1) fmt.Println("do something") } } func main() { c := make(chan int) go run(c) fmt.Println("wait") time.Sleep(time.Second * 5) c <- 1 <-c fmt.Println("main exited") }Diese Methode kann die Goroutine ordnungsgemäß stoppen, aber wenn zu viele Goroutinen vorhanden sind, sieht diese Methode in Bezug auf die Goroutine nicht gut aus Das Erscheinungsbild des Codes scheint immer noch ungeschickt zu sein.
2 Waitgroup verwenden
Die Waitgroup-Struktur im Sync-Paket ist ein gutes Werkzeug für die Synchronisierung zwischen mehreren Goroutinen, die von der Go-Sprache bereitgestellt werden. Das offizielle Dokument beschreibt es wie folgt:Normalerweise verwenden wir Waitgroup wie folgt:
Erstellen Sie eine Instanz von Waitgroup, vorausgesetzt, wir nennen sie hier wg ruft wg.Add(1) auf, wenn jede Goroutine startet. Diese Operation kann vor dem Start der Goroutine oder innerhalb der Goroutine aufgerufen werden. Natürlich können Sie auch wg.Add(n) aufrufen, bevor Sie n Goroutinen erstellen. Nachdem jede Goroutine ihre Aufgabe abgeschlossen hat, rufen Sie wg.Done() auf, wo Sie auf alle Goroutinen warten . wg.Wait(), es blockiert, bevor alle Goroutinen, die wg.Add(1) ausgeführt haben, wg.Done() aufgerufen haben, und es wird zurückgegeben, nachdem alle Goroutinen wg.Done() aufgerufen haben.Das obige ist der detaillierte Inhalt vonSo beenden Sie eine Coroutine in Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!