Heim >Backend-Entwicklung >Golang >Wie füge ich in Go eine Zeitüberschreitung zu WaitGroup.Wait() hinzu?
Müde vom ewigen Warten? Hinzufügen einer Zeitüberschreitung zu WaitGroup.Wait()
Wenn Sie WaitGroup.Wait() verwenden, um Goroutinen zu synchronisieren und sicherzustellen, dass ihre Ausführung abgeschlossen ist, möchten Sie möglicherweise gelegentlich die Möglichkeit haben, das Warten nach einer bestimmten Dauer zu beenden. Dies verhindert, dass sich Ihr System endlos auf fehlgeleitete Mitarbeiter verlässt, die ihre Aufgaben möglicherweise nie erledigen.
Eine pragmatische Lösung für zeitgesteuerte Wartegruppen
Ein Ansatz zur Implementierung einer Auszeit besteht in der Verwendung von a Kombination aus Goroutinen, Kanälen und dem Zeitpaket. Die Idee besteht darin, einen Kanal zu erstellen, der nach Abschluss aller Goroutinen ein Signal empfängt. Gleichzeitig wird ein Timer mit der gewünschten Timeout-Dauer initialisiert. Eine Select-Anweisung wird verwendet, um sowohl den Kanal als auch den Timer zu überwachen:
import ( "sync" "time" ) func task(wg *sync.WaitGroup) { // Perform some task... time.Sleep(time.Second * 2) wg.Done() } func main() { var wg sync.WaitGroup wg.Add(2) go task(&wg) go task(&wg) ch := make(chan struct{}) defer close(ch) go func() { defer wg.Done() wg.Wait() close(ch) }() timeout := 5*time.Second select { case <-ch: fmt.Println("All jobs completed within timeout.") case <-time.After(timeout): fmt.Println("Timeout reached, not all jobs completed.") } }
Vereinfachung des Timeouts mit Hilfsfunktionen
Um einen bequemeren und wiederverwendbareren Ansatz anzubieten, Erwägen Sie die Erstellung einer Hilfsfunktion, die diese Funktionalität kapselt:
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 case <-time.After(timeout): return true } }
Diese Hilfsfunktion akzeptiert eine WaitGroup und eine gewünschte Timeout-Dauer und gibt zurück, ob die Wartezeit den angegebenen Grenzwert überschritten hat oder nicht.
Verwendung der Hilfsfunktion
Die Verwendung der Hilfsfunktion ist unkompliziert:
if waitTimeout(&wg, 5*time.Second) { fmt.Println("Timeout reached waiting for wait group.") }
In diesem Beispiel gibt die Funktion „waitTimeout“ true zurück, wenn die Wartegruppe länger als 5 Sekunden benötigt abgeschlossen, was darauf hinweist, dass eine Zeitüberschreitung aufgetreten ist.
Das obige ist der detaillierte Inhalt vonWie füge ich in Go eine Zeitüberschreitung zu WaitGroup.Wait() hinzu?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!