Heim >Backend-Entwicklung >Golang >Wie kann ich eine Go-Goroutine-Ausführung nach einer Zeitüberschreitung stoppen?

Wie kann ich eine Go-Goroutine-Ausführung nach einer Zeitüberschreitung stoppen?

Barbara Streisand
Barbara StreisandOriginal
2024-12-24 11:21:15188Durchsuche

How to Stop a Go Goroutine Execution After a Timeout?

Goroutine-Ausführung bei Timeout stoppen

In Go bieten Goroutinen eine einfache Möglichkeit, Code gleichzeitig auszuführen. Manchmal ist es jedoch notwendig, eine Goroutine nach einer bestimmten Zeitspanne zu stoppen.

Problem:

Ein Benutzer ist auf ein Problem gestoßen, bei dem eine Goroutine auch nach einer Zeitüberschreitung weiter ausgeführt wurde eingestellt wurde. Sie gingen davon aus, dass die Goroutine bei Erreichen des Timeouts sofort anhalten würde, aber stattdessen wurden zusätzliche Meldungen ausgegeben. Hier ist ein Beispielcode:

type Response struct {
    data   interface{}
    status bool
}

func Find() (interface{}, bool) {
    ch := make(chan Response, 1)

    go func() {
        time.Sleep(10 * time.Second)
        fmt.Println("test")
        fmt.Println("test1")
        ch <- Response{data: "data", status: true}
    }()

    select {
    case <-ch:
        fmt.Println("Read from ch")
        res := <-ch
        return res.data, res.status
    case <-time.After(50 * time.Millisecond):
        return "Timed out", false
    }
}

Erwartete Ausgabe:

  • Zeitüberschreitung

Tatsächliche Ausgabe:

  • Zeitgesteuert out
  • test
  • test1

Analyse:

Das Problem entsteht, weil das Timeout auf der Empfangsseite eingestellt ist des Kanals, nicht auf der sendenden Seite. Während das Timeout korrekt erkennt, dass innerhalb von 50 Millisekunden keine Daten empfangen wurden, hindert es die Goroutine nicht daran, danach weiter auszuführen und Daten auf dem Kanal zu senden.

Lösung:

Da es in Go nicht möglich ist, die Ausführung einer Goroutine direkt zu unterbrechen, gibt es alternative Ansätze erforderlich:

  • Verwenden Sie ungepufferte Kanäle, die das Senden blockieren und die Goroutine zwingen, zu warten, bis der Kanal empfangsbereit ist.
  • Kontext mit Abbruch verwenden und an die Goroutine übergeben. Wenn die Zeitüberschreitung auftritt, brechen Sie den Kontext ab, und die Goroutine sollte den Kontext überprüfen und vorzeitig zurückkehren.
  • Verwenden Sie eine benutzerdefinierte Synchronisierungstechnik, wie z. B. einen Mutex oder eine Wartegruppe, um die Ausführung der Goroutine zu steuern und eine rechtzeitige Beendigung sicherzustellen.

Das obige ist der detaillierte Inhalt vonWie kann ich eine Go-Goroutine-Ausführung nach einer Zeitüberschreitung stoppen?. 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