首頁 > 後端開發 > Golang > 主體

為什麼 Go 應用程式在使用 WaitGroup 和 Channel 時會掛起?

DDD
發布: 2024-10-26 08:19:02
原創
714 人瀏覽過

Why Do Go Applications Hang When Using WaitGroups and Channels?

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!