嘗試使用sync.WaitGroup協調多個goroutines的完成時,可能會遇到錯誤“致命錯誤:所有goroutine 都在睡覺 -死鎖!
此錯誤的根源在於 Go 處理傳遞給函數的值的方式。當直接傳遞一個sync.WaitGroup物件時,Go會建立該值的副本,本質上是將一個不同的物件傳遞給每個goroutine。這會在原始 WaitGroup 和 goroutine 所操作的副本之間造成脫節。
此問題的解決方案是將指標傳遞給sync.WaitGroup。透過這樣做,所有 goroutine 將引用相同的底層物件並一致地對其內部計數器進行操作。下面提供了使用指標的正確程式碼:
import "sync" func doWork(wg *sync.WaitGroup) error { defer wg.Done() // Do some heavy lifting... request URL's or similar return nil } func main() { wg := &sync.WaitGroup{} // Use pointer to pass the WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go doWork(wg) } }
透過此更改,goroutine 將與 WaitGroup 物件正確交互,在開始工作之前遞增其計數器,並在完成後遞減計數器。因此,主函數中的 WaitGroup.Wait() 呼叫不會無限期地阻塞,程式將如預期執行。
以上是為什麼使用 `sync.WaitGroup` 會導致'致命錯誤:所有 goroutine 都在睡眠 - 死鎖!”,以及如何修復它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!