首页  >  文章  >  后端开发  >  为什么即使所有 Goroutines 都已完成,我的 Go 程序仍会停止? sync.WaitGroup 和通道阻塞指南。

为什么即使所有 Goroutines 都已完成,我的 Go 程序仍会停止? sync.WaitGroup 和通道阻塞指南。

Barbara Streisand
Barbara Streisand原创
2024-10-25 11:54:02793浏览

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