Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann man eine Goroutine in Go mithilfe von Signalen elegant stoppen?

Wie kann man eine Goroutine in Go mithilfe von Signalen elegant stoppen?

Barbara Streisand
Barbara StreisandOriginal
2024-10-28 13:23:02436Durchsuche

How to Gracefully Stop a Goroutine in Go Using Signals?

Eine Goroutine mit Signalen stoppen

In Go sind Goroutinen leichtgewichtige Threads, die für die Parallelität verwendet werden. Es kann jedoch Szenarien geben, in denen wir eine Goroutine vorzeitig beenden müssen. In diesem Artikel wird untersucht, wie dies mithilfe von Signalmechanismen erreicht werden kann.

Im bereitgestellten Code besteht das Ziel darin, eine Goroutine zu stoppen, wenn eine bestimmte Bedingung (tooLate) wahr wird. Die Verwendung eines zweiten Kanals wie vorgeschlagen würde jedoch beim Lesen tatsächlich die Goroutine blockieren.

Verwendung eines zusätzlichen Kanals mit Select

Ein besserer Ansatz besteht darin, einen separaten Kanal zu erstellen ( tooLate) und die Verwendung von select in der Goroutine, um sowohl den Verarbeitungskanal (proCh) als auch den tooLate-Kanal zu überwachen. Wenn tooLate ein Signal empfängt, kann die Goroutine ordnungsgemäß beendet werden.

<code class="go">package main

import "fmt"
import "time"

func main() {
    tooLate := make(chan struct{})
    proCh := make(chan string)

    go func() {
        for {
            fmt.Println("working")
            time.Sleep(1 * time.Second)
            select {
            case <-tooLate:
                fmt.Println("stopped")
                return
            case proCh <- "processed":
            default: // Adding default makes it non-blocking
            }
            fmt.Println("done here")
        }
    }()

    select {
    case proc := <-proCh:
        fmt.Println(proc)
    case <-time.After(1 * time.Second):
        fmt.Println("too late")
        close(tooLate)
    }

    time.Sleep(4 * time.Second)
    fmt.Println("finish\n")
}</code>

Wenn in diesem aktualisierten Code der Timer abläuft (was anzeigt, dass es zu spät ist), wird der tooLate-Kanal geschlossen und ein Signal an die Goroutine gesendet. Die Goroutine empfängt dieses Signal und wird entsprechend beendet.

Verwendung von sync.Cond

Eine weitere zu berücksichtigende Option ist die Verwendung von sync.Cond, die eine detailliertere Kontrolle über die Signalisierung bietet. Es erfordert jedoch etwas mehr Einrichtungs- und Synchronisierungslogik.

Das obige ist der detaillierte Inhalt vonWie kann man eine Goroutine in Go mithilfe von Signalen elegant 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