使用Iris 框架在超時時停止Goroutine 執行
在使用Goroutine 時,如果停止超過某個值,通常需要它們的執行時限。然而,一個常見的問題是,即使發生逾時,goroutines 仍會繼續執行。
為了解決這個問題,使用了以下程式碼片段:
import ( "fmt" "time" "github.com/kataras/iris/v12" ) type Response struct { data interface{} status bool } func (s *CicService) 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 } }
這個如果超過 50 毫秒的超時,程式碼會利用緩衝通道和 select 語句嘗試終止 Goroutine。然而,「Timed out」的預期輸出並未實現。相反,輸出包括超時訊息以及隨後的“test”和“test1”列印輸出。
要理解為什麼會發生這種情況,重要的是要考慮 Go 中 goroutine 的行為。在 Go 中,沒有有效的方法來強制停止正在運行的 goroutine。相反,必須使用通道和互斥鎖等同步機制。
程式碼中使用的逾時是通道接收操作的逾時,而不是 goroutine 本身的逾時。因此,即使接收操作逾時,發送到通道的 Goroutine 也會繼續執行,產生後續的列印輸出。
在這種情況下,有必要在 Goroutine 之間實現某種形式的同步性。這可能涉及使用訊號通道或上下文將超時傳達給正在執行長時間運行任務的 goroutine,使其能夠優雅地處理取消。
透過了解 Go 中 goroutine 執行的限制,採用適當的同步技術,可以在超時時有效地停止 goroutine。
以上是如何在 Iris 框架中優雅地停止超時的 Goroutine 執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!