Heim > Backend-Entwicklung > Golang > So warten Sie elegant auf den Abschluss von Go-Routinen: Boolesche Kanäle vs. sync.WaitGroup?

So warten Sie elegant auf den Abschluss von Go-Routinen: Boolesche Kanäle vs. sync.WaitGroup?

DDD
Freigeben: 2024-12-05 14:45:12
Original
931 Leute haben es durchsucht

How to Gracefully Wait for Go Routines to Finish: Boolean Channels vs. sync.WaitGroup?

So warten Sie elegant auf den Abschluss von Go-Routinen

Bei der Entwicklung mit Go ist es wichtig sicherzustellen, dass die Routinen abgeschlossen sind, bevor das Programm beendet wird. Durch die Verwendung eines booleschen Kanals, wie im bereitgestellten Playground-Link veranschaulicht, kann dies effektiv erreicht werden.

Verstehen der Kanaloperation

Die Blockierungsoperation <- done unterbricht die Programmausführung bis ein wahrer oder falscher Wert über den Kanal gesendet wird. Daher wartet die Funktion main() im angegebenen Code, bis done den booleschen Wert true von der Routine do_stuff erhält.

Umgang mit Deadlock-Szenarien

Auskommentieren der letzten Zeile, <-done führt zu einem Deadlock, da der Kanal leer ist. Ohne dass eine andere Routine Werte an sie sendet, bleibt die Funktion main() auf unbestimmte Zeit blockiert. Um diese Situation zu vermeiden, muss unbedingt sichergestellt werden, dass eine Routine immer zum erwarteten Zeitpunkt einen Wert über den Kanal sendet und der Wartefunktion den Abschluss signalisiert.

Alternative Ansätze

While Die boolesche Kanalmethode ist eine einfache Lösung, das Sync-Paket bietet zusätzliche Optionen zur Koordinierung gleichzeitiger Vorgänge. Betrachten Sie den folgenden Code:

package main

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

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            longOp()
            wg.Done()
        }()
    }
    // Waits until all routines complete (wg.Done called 10 times)
    wg.Wait()
}

func longOp() {
    time.Sleep(time.Second * 2)
    fmt.Println("Long operation completed")
}
Nach dem Login kopieren

In diesem Szenario wird sync.WaitGroup verwendet, um gleichzeitige Routinen zu verfolgen und zu synchronisieren, um sicherzustellen, dass main() auf den Abschluss aller Routinen wartet, bevor die Ausführung fortgesetzt wird.

Das obige ist der detaillierte Inhalt vonSo warten Sie elegant auf den Abschluss von Go-Routinen: Boolesche Kanäle vs. sync.WaitGroup?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage