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

Go中如何在超時後正確停止Goroutine的執行?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-11 21:30:12969瀏覽

How Can I Properly Stop a Goroutine's Execution After a Timeout in Go?

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

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