在 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中文网其他相关文章!