在崩潰時確保Goroutine 持久性
在並發Go 程式中,多個Goroutine 通常同時運行,每個Goroutine 執行不同的任務。然而,解決處理 goroutine 故障的問題至關重要,確保即使其中一個 goroutine 崩潰了,其他 goroutine 也能繼續運作。
考慮一個具有兩個 goroutine 的程式:queue.ConsumeAndDoSomething() 消耗一個佇列,而 api.StartServer () 運行 API。理想情況下,如果queue.ConsumeAndDoSomething()失敗,API伺服器應該不受影響,反之亦然。
實現這種持久性的一種方法是透過內建的recover()函數和延遲函數。 recover() 函數可以捕捉恐慌並執行清理例程,而延遲函數會在周圍函數的末端自動執行。
以下是如何使用recover() 和延遲函數來防止goroutine 崩潰:
func protect(f func()) { defer func() { if err := recover(); err != nil { log.Printf("Recovered: %v", err) } }() f() }
這個輔助函數,protect(),將提供的函數(f) 包裝在一個處理任何在恐慌的延遲函數中。無論是否發生panic,延遲函數都會在f返回之前執行。
要使用protect(),只需將goroutine函數作為參數傳遞即可:
func main() { go protect(queue.ConsumeAndDoSomething) go protect(api.StartServer) for { time.Sleep(time.Second) fmt.Println("tick") } }
使用這種機制在適當的情況下,如果queue.ConsumeAndDoSomething()或api .StartServer()遇到恐慌,它將被延遲函數捕獲並清理,而不會導致程式崩潰。另一個 goroutine 將繼續按預期運行。
以上是Go的recover()函式如何保證崩潰時Goroutine的持久性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!