使用訊號停止 Goroutine
在 Go 中,goroutine 是用於並發的輕量級執行緒。然而,在某些情況下我們可能需要提前終止一個 goroutine。本文探討如何使用訊號機制來實現這一目標。
在提供的程式碼中,目標是當特定條件(tooLate)變成真時停止 goroutine。然而,使用建議的第二個通道確實會在讀取時阻塞 goroutine。
透過Select 使用附加通道
更好的方法是建立一個單獨的通道( tooLate) 並在goroutine 中使用select 來監視處理通道(proCh) 和tooLate 通道。當tooLate收到訊號時,goroutine可以正常終止。
<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>
在這個更新的程式碼中,當計時器到期(表示為時已晚)時,tooLate通道被關閉,向goroutine發送訊號。 Goroutine 接收此訊號並相應地終止。
使用sync.Cond
另一個需要考慮的選項是使用sync.Cond,它提供了對訊號更精細的控制。然而,它需要更多的設定和同步邏輯。
以上是如何使用訊號優雅地停止 Go 中的 Goroutine?的詳細內容。更多資訊請關注PHP中文網其他相關文章!