首頁  >  文章  >  後端開發  >  **為什麼我的使用 WaitGroup 和 Channels 的 Golang 程式無限期地運行?

**為什麼我的使用 WaitGroup 和 Channels 的 Golang 程式無限期地運行?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-26 09:46:29767瀏覽

**Why Does My Golang Program Using WaitGroup and Channels Run Indefinitely?**

Golang程式中WaitGroup和Channel的使用

這個Golang程式利用sync.WaitGroup和Channel 。但是,它遇到了程式在完成任務後不退出的問題。本文深入研究了該問題並提供了解決方案。

程式包括檢索股票報價的代碼列表,然後將結果儲存到文件中。它採用 goroutine 和通道的組合來並發執行獲取過程,並使用 WaitGroup 來追蹤所有任務的完成情況。然而,由於 fetchedSymbols 通道無限期地保持打開狀態,程式陷入了無限循環。

要解決此問題,程式需要在所有 goroutine 完成任務後關閉 fetchedSymbols 通道。 WaitGroup 已經追蹤 goroutine 完成情況,可以用於此目的。透過增加一個 go func() 包裝器,當 WaitGroup 達到零時關閉通道,問題就解決了。

修改後的程式碼部分如下:

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

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

...</code>

新增的 go func() 例程等待 WaitGroup 達到零,表示所有 goroutine 已完成其任務。然後它關閉 fetchedSymbols 通道,讓 main 中的 range 循環如預期退出,讓程式完成執行。

這個改進的程式有效地利用了 WaitGroup 和通道來並發 goroutine 執行和資料檢索,然後它退出完成所有必要的任務後優雅地完成。

以上是**為什麼我的使用 WaitGroup 和 Channels 的 Golang 程式無限期地運行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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