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