首页 > 后端开发 > Golang > **为什么我的使用 WaitGroup 和 Channels 的 Golang 程序无限期运行?**

**为什么我的使用 WaitGroup 和 Channels 的 Golang 程序无限期运行?**

Mary-Kate Olsen
发布: 2024-10-26 09:46:29
原创
874 人浏览过

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

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板