Go 中透過超時停止 Goroutine 執行
當嘗試在超時時終止 Goroutine 執行時,可能會顯得無效。這是因為 Go 的並發模型按照 fork-join 原理運行,其中啟動 goroutine(fork)並不能立即控制其執行。僅在同步點(例如通道通訊)重新獲得控制權。
在給定的範例中:
go func() { time.Sleep(10 * time.Second) fmt.Println("test") fmt.Println("test1") ch <- Response{data: "data", status: true} }()
儘管設定了超時,但goroutine 仍繼續執行:
case <-time.After(50 * time.Millisecond): return "Timed out", false
這是因為超時與通道的接收者(閱讀器)有關,而不是發送者。由於通道被緩衝,發送方可以繼續執行而不會中斷。
為了實現所需的行為,必須採用同步技術。例如,通道可以在超時時關閉以防止進一步通訊:
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 }
以上是Go中如何在超時後正確停止Goroutine的執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!