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