Heim > Backend-Entwicklung > Golang > Wie kann sichergestellt werden, dass alle Goroutinen vor dem Beenden des Programms abgeschlossen sind, wenn ein gepufferter Kanal als Semaphor verwendet wird?

Wie kann sichergestellt werden, dass alle Goroutinen vor dem Beenden des Programms abgeschlossen sind, wenn ein gepufferter Kanal als Semaphor verwendet wird?

Linda Hamilton
Freigeben: 2024-12-30 10:09:11
Original
498 Leute haben es durchsucht

How to Ensure All Goroutines Complete Before Program Exit When Using a Buffered Channel as a Semaphore?

Warten auf die Entleerung eines gepufferten Kanals

Im bereitgestellten Code wird ein gepufferter Kanal als Semaphor verwendet, um die Anzahl gleichzeitiger Kanäle zu begrenzen Goroutinen ausführen. Ohne einen expliziten Mechanismus, der darauf wartet, dass der Kanal leer wird, kann das Hauptprogramm jedoch beendet werden, bevor alle Goroutinen die Ausführung abgeschlossen haben.

Problem:

So stellen Sie das sicher Das Programm wartet, bis alle Goroutinen abgeschlossen sind Beenden?

Antwort:

Die Verwendung eines Semaphors (Kanals) für diesen Zweck ist nicht ideal, da es keine integrierte Möglichkeit gibt, die Länge des Kanals zu überprüfen und abzuwarten Es soll 0 erreichen. Um ordnungsgemäß auf den Abschluss von Goroutinen zu warten, sollten Sie die Verwendung eines Synchronisierungsprimitivs wie a in Betracht ziehen sync.WaitGroup.

Aktualisierter Code:

sem := make(chan struct{}, 2)
var wg sync.WaitGroup

for _, i := range ints {
    wg.Add(1)
    // acquire semaphore
    sem <- struct{}{}
    // start long running go routine
    go func(id int) {
        defer wg.Done()
        // do something
        // release semaphore
        <-sem
    }(i)
}

wg.Wait()
Nach dem Login kopieren

Die sync.WaitGroup verwaltet eine Anzahl ausstehender Aufgaben (in diesem Fall Goroutinen). . Dadurch kann das Hauptprogramm warten, bis alle Aufgaben abgeschlossen sind. wg.Add(1) erhöht die Aufgabenanzahl, bevor eine neue Goroutine gestartet wird, und wg.Done() verringert die Anzahl, wenn eine Goroutine beendet ist. Der Aufruf wg.Wait() blockiert das Hauptprogramm, bis die Aufgabenanzahl 0 erreicht, und stellt so sicher, dass alle Goroutinen abgeschlossen sind, bevor das Programm beendet wird.

Das obige ist der detaillierte Inhalt vonWie kann sichergestellt werden, dass alle Goroutinen vor dem Beenden des Programms abgeschlossen sind, wenn ein gepufferter Kanal als Semaphor verwendet wird?. 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage