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()
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!