Golang程序中WaitGroup和Channel的使用
这个Golang程序利用sync.WaitGroup和Channel来实现高效的goroutine执行和数据收集。但是,它遇到了程序在完成任务后不退出的问题。本文深入研究了该问题并提供了解决方案。
该程序包括检索股票报价的代码列表,然后将结果保存到文件中。它采用 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中文网其他相关文章!