首頁 > 後端開發 > Golang > Go Goroutine 逾時後如何取消執行?

Go Goroutine 逾時後如何取消執行?

Susan Sarandon
發布: 2024-12-16 18:56:15
原創
331 人瀏覽過

How to Cancel a Go Goroutine's Execution After a Timeout?

超時取消 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板