Golangsync.WaitGroup 永遠不會完成:調試故事
在並發程式設計中,優雅地管理 goroutine 終止至關重要。 sync.WaitGroup 可讓您追蹤多個任務的完成情況並等待所有任務完成。但是,如果您的 WaitGroup 似乎從未完成,則可能存在一些潛在問題。
其中一個問題是 Add 和 Done 方法的錯誤使用。在給定的程式碼中,我們同時取得和下載文件,Add 和 Done 方法沒有正確使用。為了確保 WaitGroup 正確更新,必須將指向 WaitGroup 的指標而不是副本傳遞給 Goroutine。
func main() { ... go downloadFromURL(url, &wg) ... }
當 wg.Done() 呼叫未放置為goroutine 中的第一個語句之一。如果 goroutine 中發生錯誤且函數過早返回,則 wg.Done() 呼叫可能不會執行。
func downloadFromURL(url string, wg *sync.WaitGroup) error { defer wg.Done() ... }
透過將 wg.Done() 呼叫作為第一個語句,我們確保無論後續出現任何錯誤,它都會被執行。此修改可確保 WaitGroup 正確遞減,並且主 goroutine 可以偵測到所有檔案下載的完成情況,防止程式無限期掛起。
以上是為什麼我的 Go `sync.WaitGroup` 沒有完成?的詳細內容。更多資訊請關注PHP中文網其他相關文章!