首頁 > 後端開發 > Golang > 我的 Go Main Goroutine 應該永遠休眠還是優雅退出?

我的 Go Main Goroutine 應該永遠休眠還是優雅退出?

DDD
發布: 2024-12-18 14:16:15
原創
539 人瀏覽過

Should My Go Main Goroutine Sleep Forever or Gracefully Quit?

主 Goroutine 的困境:睡覺還是退出?

開發人員經常遇到需要保持 Go 專案持續運作的情況,就像永恆的火焰一樣,永遠不會消失。相反,在某些情況下,人們希望優雅地結束程式的執行。本文探討了適用於這些場景的選項。

「休眠」主 Goroutine

為了使主 Goroutine 處於休眠狀態,存在幾種結構,可以有效地阻止其執行,而無需消耗CPU資源。請考慮以下範例:

  • 選擇不含大小寫的:

    select{}
    登入後複製
  • 從空接收通道:

    <-make(chan int)
    登入後複製
  • 從零通道接收:

    <-(chan int)(nil)
    登入後複製
  • 傳送到零通道:

    (chan int)(nil) <- 0
    登入後複製
  • 鎖定鎖定的互斥體:

    mu := sync.Mutex{}
    mu.Lock()
    mu.Lock()
    登入後複製

var quit = make(chan struct{})

func main() {
    // Startup code...

    // Block until the quit signal arrives:
    <-quit
}

// In a separate goroutine, when termination is requested:
close(quit)
登入後複製

time.Sleep(time.Duration(1<<63 - 1))
登入後複製

for {
    time.Sleep(time.Duration(1<<63 - 1))
}
登入後複製
誘導結局:退出Goroutine如果目標是提供終止手段,那麼引入退出通道是可行的方法。在主 goroutine 中,程式碼可以無限期地等待來自該通道的訊號。當時機成熟時,可以關閉退出通道:注意:關閉退出通道可以觸發程序立即終止,根據Go程序執行規範。 非阻塞睡眠在阻塞主線程的情況下goroutine 是不可取的,另一種選擇是使用具有較長持續時間的time.Sleep( ) 。允許的最長持續時間約為 292 年:對於注定要超過此持續時間的程序,可以實現無限循環:

以上是我的 Go Main Goroutine 應該永遠休眠還是優雅退出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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