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

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

DDD
DDD原創
2024-12-18 14:16:15540瀏覽

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

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