Heim >Backend-Entwicklung >Golang >Wie füge ich in Go eine Zeitüberschreitung zu WaitGroup.Wait() hinzu?

Wie füge ich in Go eine Zeitüberschreitung zu WaitGroup.Wait() hinzu?

Susan Sarandon
Susan SarandonOriginal
2024-11-21 06:03:09774Durchsuche

How to Add a Timeout to WaitGroup.Wait() in Go?

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!

Stellungnahme:
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