首頁 >後端開發 >Golang >為什麼即使所有 Goroutines 都已完成,我的 Go 程式仍會停止? sync.WaitGroup 和通道阻塞指南。

為什麼即使所有 Goroutines 都已完成,我的 Go 程式仍會停止? sync.WaitGroup 和通道阻塞指南。

Barbara Streisand
Barbara Streisand原創
2024-10-25 11:54:02898瀏覽

Why Does My Go Program Stall Even When All Goroutines Have Finished? A Guide to sync.WaitGroup and Channel Blocking.

對Goroutine 退出的困惑:揭開sync.WaitGroup 和通道阻塞的神秘面紗

在Go 中,使用sync.WaitGroup 和通道管理並發是一種常見的做法。然而,對於初學者來說,當程式在滿足 goroutine 完成期望的情況下仍然停滯時,可能會令人困惑。讓我們深入研究一個具體案例並揭開根本問題。

問題

開發人員利用sync.WaitGroup 和通道 (fetchedSymbols) 實作了一個程式來同時擷取股票報價清單。當程式等待 goroutine 完成時,它拒絕終止。

理解問題

問題的根源在於省略關閉 fetchedSymbols 通道。當在主函數中迭代此通道時,程式將無限期地阻塞。在這種情況下,應該在所有goroutine完成後才開始關閉通道。

解決方案

為了保證程式順利執行,開發者引入了一個輔助goroutine來監控sync.WaitGroup並觸發一旦所有 goroutine 完成其任務,就會關閉 fetchedSymbols。這消除了阻塞行為並允許程式優雅退出。

實現

<code class="go">go func() {
    wg.Wait()
    close(fetchedSymbols)
}()

for response := range fetchedSymbols {
    fmt.Println("fetched " + response)
}</code>

透過實現此解決方案,程式現在可以在成功下載所有股票報價後優雅退出,從而有效地利用了 Go 的並發性特點。

以上是為什麼即使所有 Goroutines 都已完成,我的 Go 程式仍會停止? sync.WaitGroup 和通道阻塞指南。的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn