使用WaitGroups 關閉Go 應用程式中的乾淨退出通道
本文研究了在Go 中使用sync.WaitGroup 和通道時遇到的常見問題程序,這可以防止main 函數在所有goroutine 完成其任務後退出。讓我們探討這個問題及其解決方案。
問題:無限等待
在提供的範例中,main 函數使用了sync.WaitGroup 和通道(fetchedSymbols)管理取得和保存股票報價的並發 goroutine。當 goroutine 完成任務時,程式會無限期掛起而不退出。
問題:非閉合通道
罪魁禍首是 main 函數中的範圍循環。迭代 fetchedSymbols 通道會阻止進度,因為該通道永遠不會關閉。因此,即使所有值都已收到,主函數也會無限期地等待透過通道發送新值。
解決方案:關閉通道
要解決這個問題,在所有 goroutine 完成任務後關閉 fetchedSymbols 通道至關重要。這向範圍循環發出信號,表明沒有更多的值可以接收,從而允許迭代結束並繼續執行主函數。
一種方法是使用sync.WaitGroup的Wait方法在所有值都發出訊號時發出訊號Goroutines 已經完成。可以啟動一個 goroutine 等待 WaitGroup 為零,然後關閉通道。
<code class="go">go func() { wg.Wait() close(fetchedSymbols) }()</code>
透過此修改,主函數中的範圍循環最終將到達通道的末尾,從而允許程式列印「完成」訊息並正常退出。
透過了解在使用sync.WaitGroup時關閉通道的重要性,Go開發人員可以確保他們的應用程式在執行並發任務後可預測地終止。
以上是為什麼 Go 應用程式在使用 WaitGroup 和 Channel 時會掛起?的詳細內容。更多資訊請關注PHP中文網其他相關文章!