超時取消 Goroutine 執行
在 Go 例程中,可能需要在超過特定時間閾值後終止操作。這可能會帶來挑戰,因為 Go 通常非同步運行 goroutine,而無法直接控制其執行。使用 iris 框架時會出現一種常見情況,您可能會遇到 goroutine 即使在超時後仍繼續執行的情況。
考慮以下程式碼片段:
package main import ( "fmt" "time" ) func main() { Res := make(chan Response, 1) go func() { time.Sleep(10 * time.Second) fmt.Println("test") Res <- Response{data: "data", status: true} }() select { case <-Res: fmt.Println("Read from ch") res := <-Res fmt.Println(res.data, res.status) case <-time.After(50 * time.Millisecond): fmt.Println("Timed out") } } type Response struct { data interface{} status bool }
如圖所示在範例中,在 10 秒延遲後啟動一個 goroutine 來列印測試。通道(Res)用於促進 Goroutine 和主 Goroutine 之間的通訊。 select 語句用於等待 goroutine 的回應或等待 50 毫秒的逾時。
但是,預期的行為是一旦超時發生,goroutine 應立即終止。相反,輸出顯示即使逾時已過,仍會列印 test。
出現這種情況是因為 Go 中沒有簡單的方法來強制中斷正在運行的 goroutine 的執行。 Go 在 fork-join 並發模型上運行,其中新的 goroutine 作為單獨的執行緒建立。一旦創建,goroutine 的調度和處理就成為 Go 運行時責任的一部分。
為了解決這個問題,建議採用同步技術,以便對 goroutine 行為進行更精細的控制。
以上是Go Goroutine 逾時後如何取消執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!