首页  >  文章  >  后端开发  >  以下是一些适合您提供的文本的基于问题的标题: * **Go WaitGroup 和 Channels:为什么我的程序不退出?** * **陷入循环:如何使用 WaitGro 正确关闭 Go 中的通道

以下是一些适合您提供的文本的基于问题的标题: * **Go WaitGroup 和 Channels:为什么我的程序不退出?** * **陷入循环:如何使用 WaitGro 正确关闭 Go 中的通道

DDD
DDD原创
2024-10-26 11:33:03226浏览

Here are a few question-based titles that fit your provided text:

* **Go WaitGroup and Channels: Why Does My Program Not Exit?**
* **Stuck in a Loop: How to Properly Close Channels in Go with WaitGroup**
* **Channel Not Closed, Program Stalled: Debugging

频道未关闭,程序停止

在使用sync.WaitGroup和频道的Go应用程序中,您遇到了程序的问题即使等待所有 goroutine 完成后也不会退出。

问题详细信息

您的代码使用 WaitGroup 来跟踪 goroutine 完成并使用通道来传输获取的符号名称。然而,fetchedSymbols 通道无限期地保持打开状态,从而防止 main 中的循环终止。

解决方案

  1. 使用 WaitGroup 关闭信号通道: 使用用于跟踪 goroutine 完成情况的 WaitGroup 来发出何时关闭通道的信号。引入一个 goroutine,等待 WaitGroup 达到零,然后关闭通道。
<code class="go">go func() {
    wg.Wait()
    close(fetchedSymbols)
}()</code>
  1. 删除不必要的阻塞: fetchedSymbols 上的范围循环已经阻塞,直到通道已关闭,从而使任何其他通道或 WaitGroup 变得多余。因此,删除以下代码:
<code class="go">for {
    select {
    case symbol := <-fetchedSymbols:
        fmt.Println("fetched", symbol)
    }
}</code>
  1. 关闭延迟: 请记住在 fetchSymbol goroutine 中关闭延迟,以确保请求和文件写入在退出前完成.

通过这些修改,您的代码现在将在获取并存储所有符号引号后正确退出。

以上是以下是一些适合您提供的文本的基于问题的标题: * **Go WaitGroup 和 Channels:为什么我的程序不退出?** * **陷入循环:如何使用 WaitGro 正确关闭 Go 中的通道的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn