首頁 >後端開發 >Golang >如何在超時後停止 Go Goroutine 執行?

如何在超時後停止 Go Goroutine 執行?

Barbara Streisand
Barbara Streisand原創
2024-12-24 11:21:15188瀏覽

How to Stop a Go Goroutine Execution After a Timeout?

超時停止 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 的執行,因此替代方法是需要:
  • 使用無緩衝的通道,它會阻止發送並強制Goroutine 等待,直到通道準備好接收。
使用帶有取消的上下文並將其傳遞給 Goroutine。當超時發生時,取消上下文,goroutine 應該檢查上下文並提前返回。 使用自訂同步技術,例如互斥鎖或等待群組,來控制 goroutine 執行並確保及時終止。

以上是如何在超時後停止 Go Goroutine 執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn