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

Wie kann ich die Ausführung einer Go-Goroutine nach einer Zeitüberschreitung abbrechen?

Susan Sarandon
Freigeben: 2024-12-16 18:56:15
Original
330 Leute haben es durchsucht

How to Cancel a Go Goroutine's Execution After a Timeout?

Goroutine-Ausführung bei Zeitüberschreitung abbrechen

In Go-Routinen kann es erforderlich sein, Vorgänge nach einem bestimmten Zeitschwellenwert abzubrechen. Dies kann eine Herausforderung darstellen, da Go Goroutinen normalerweise asynchron ausführt, ohne direkte Kontrolle über deren Ausführung. Ein häufiges Szenario entsteht bei der Verwendung des Iris-Frameworks, in dem Situationen auftreten können, in denen eine Goroutine die Ausführung fortsetzt, auch nachdem eine Zeitüberschreitung aufgetreten ist.

Beachten Sie den folgenden Codeausschnitt:

package main

import (
    "fmt"
    "time"
)

func main() {
    Res := make(chan Response, 1)

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

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

type Response struct {
    data   interface{}
    status bool
}
Nach dem Login kopieren

Wie dargestellt Im Beispiel wird nach einer Verzögerung von 10 Sekunden eine Goroutine zum Drucken von Tests gestartet. Ein Kanal (Res) wird verwendet, um die Kommunikation zwischen der Goroutine und der Haupt-Goroutine zu erleichtern. Eine Select-Anweisung wird verwendet, um entweder auf eine Antwort von der Goroutine oder auf eine Zeitüberschreitung von 50 Millisekunden zu warten.

Das erwartete Verhalten ist jedoch, dass die Goroutine beendet werden sollte, sobald die Zeitüberschreitung auftritt. Stattdessen zeigt die Ausgabe, dass der Test immer noch gedruckt wird, obwohl das Timeout abgelaufen ist.

Dies liegt daran, dass es in Go keine einfache Methode gibt, um die Ausführung einer laufenden Goroutine zwangsweise zu unterbrechen. Go arbeitet nach einem Fork-Join-Parallelitätsmodell, bei dem eine neue Goroutine als separater Ausführungsthread erstellt wird. Nach der Erstellung fällt die Planung und Handhabung von Goroutinen in den Verantwortungsbereich der Go-Laufzeit.

Um dieses Problem zu beheben, wird empfohlen, Synchronisierungstechniken zu verwenden, die eine detailliertere Kontrolle über das Verhalten von Goroutinen ermöglichen.

Das obige ist der detaillierte Inhalt vonWie kann ich die Ausführung einer Go-Goroutine nach einer Zeitüberschreitung abbrechen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage