Heim >Backend-Entwicklung >Golang >Wie kann ich die Ausführung einer Goroutine nach einem Timeout in Go ordnungsgemäß stoppen?

Wie kann ich die Ausführung einer Goroutine nach einem Timeout in Go ordnungsgemäß stoppen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-11 21:30:12976Durchsuche

How Can I Properly Stop a Goroutine's Execution After a Timeout in Go?

Goroutine-Ausführung bei Zeitüberschreitungen in Go stoppen

Der Versuch, die Goroutine-Ausführung bei einer Zeitüberschreitung zu beenden, kann wirkungslos erscheinen. Dies liegt daran, dass das Parallelitätsmodell von Go nach dem Fork-Join-Prinzip arbeitet, bei dem das Initiieren einer Goroutine (Fork) keine unmittelbare Kontrolle über deren Ausführung bietet. Die Kontrolle wird nur an Synchronisationspunkten wie der Kanalkommunikation wiedererlangt.

Im gegebenen Beispiel:

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

Die Goroutine setzt die Ausführung fort, trotz des eingestellten Timeouts in:

case <-time.After(50 * time.Millisecond):
    return "Timed out", false

Das liegt daran, dass die Zeitüberschreitung den Empfänger (Leser) des Kanals betrifft, nicht den Absender. Da der Kanal gepuffert ist, kann der Absender die Ausführung ohne Unterbrechung fortsetzen.

Um das gewünschte Verhalten zu erreichen, müssen Synchronisationstechniken eingesetzt werden. Beispielsweise könnte der Kanal bei Zeitüberschreitung geschlossen werden, um eine weitere Kommunikation zu verhindern:

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

Das obige ist der detaillierte Inhalt vonWie kann ich die Ausführung einer Goroutine nach einem Timeout in Go ordnungsgemäß 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