超時停止 Goroutine 執行
在 Go 中,goroutine 提供了一種輕量級的並發執行程式碼的方法。然而,有時需要在特定時間後停止 goroutine。
問題:
使用者遇到一個問題,即 goroutine 在超時後仍繼續執行已設定。他們期望 Goroutine 在達到超時後立即停止,但相反,它打印了額外的消息。以下是範例程式碼:
type Response struct { data interface{} status bool } func Find() (interface{}, bool) { ch := make(chan Response, 1) go func() { time.Sleep(10 * time.Second) fmt.Println("test") fmt.Println("test1") ch <- Response{data: "data", status: true} }() select { case <-ch: fmt.Println("Read from ch") res := <-ch return res.data, res.status case <-time.After(50 * time.Millisecond): return "Timed out", false } }
預期輸出:
超時
test1
分析:出現問題是因為通道的接收端設定了超時ch,不在傳送端。雖然超時正確地識別出 50 毫秒內沒有收到數據,但它並不能阻止 goroutine 進一步執行並隨後在通道上發送數據。
解決方案:以上是如何在超時後停止 Go Goroutine 執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!