Heim >Backend-Entwicklung >Golang >Wie implementiert man eine zeitgesteuerte Wartezeit für WaitGroup.Wait() in Go?
Timed Wait for WaitGroup.Wait()
In Go wird der WaitGroup-Typ verwendet, um mehrere Goroutinen zu synchronisieren, bis alle ihre Aufgaben abgeschlossen haben . Die WaitGroup.Wait()-Methode blockiert, bis alle Mitglieder der Gruppe ihren Abschluss signalisiert haben oder der Kontext abgebrochen wird.
Manchmal ist es jedoch wünschenswert, dem WaitGroup-Wartevorgang eine Zeitüberschreitung aufzuerlegen, um den Scheduler zu verhindern vom ewigen Warten auf einen fehlgeleiteten Arbeiter. Dies wirft philosophische Fragen zur Zuverlässigkeit und Wiederherstellbarkeit des Systems bei Vorliegen solcher Fehler auf, diese Diskussion würde jedoch den Rahmen dieser Frage sprengen.
Lösung
Die bereitgestellte Lösung nutzt einen Kanal und eine Select-Anweisung, um die Timeout-Funktionalität zu erreichen:
c := make(chan struct{}) go func() { defer wg.Done() // Do the work c <- struct{}{} }() select { case <-c: // Work completed case <-time.After(timeout): // Timed out }
Diese Lösung ist effektiv, aber sie mag übermäßig kompliziert erscheinen. Die folgenden Tipps können es verbessern:
Hilfsfunktion
Um den Prozess zu vereinfachen, kann eine Hilfsfunktion erstellt werden, um die Timeout-Logik zu kapseln:
func waitTimeout(wg *sync.WaitGroup, timeout time.Duration) bool { c := make(chan struct{}) go func() { defer close(c) wg.Wait() }() select { case <-c: return false // Completed normally case <-time.After(timeout): return true // Timed out } }
Diese Funktion umschließt die Timeout-Funktionalität und vereinfacht die Verwendung:
if waitTimeout(&wg, time.Second) { fmt.Println("Timed out waiting for wait group") } else { fmt.Println("Wait group finished") }
Dieser Ansatz bietet eine Sauberere und bequemere Möglichkeit, Zeitüberschreitungen für WaitGroup.Wait()-Vorgänge zu handhaben.
Das obige ist der detaillierte Inhalt vonWie implementiert man eine zeitgesteuerte Wartezeit für WaitGroup.Wait() in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!