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!