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

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

Mary-Kate Olsen
發布: 2024-12-11 21:30:12
原創
1068 人瀏覽過

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

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