首頁  >  文章  >  後端開發  >  以下是一些適合您提供的文本的基於問題的標題: * **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 關閉訊號通道:
  2. 使用用於追蹤goroutine 完成情況的WaitGroup 來發出何時關閉通道的信號。引入一個 goroutine,等待 WaitGroup 達到零,然後關閉通道。
<code class="go">go func() {
    wg.Wait()
    close(fetchedSymbols)
}()</code>
  1. 刪除不必要的阻塞:
  2. fetchedSymbols 上的範圍循環已經阻塞,直到通道已關閉,從而使任何其他通道或WaitGroup 變得多餘。因此,請刪除以下程式碼:
<code class="go">for {
    select {
    case symbol := <-fetchedSymbols:
        fmt.Println("fetched", symbol)
    }
}</code>
  1. 關閉延遲:
  2. 請記住在fetchSymbol goroutine 中關閉延遲,以確保請求和文件寫入在退出前完成.

透過這些修改,您的程式碼現在將在取得並儲存所有符號引號後正確退出。

以上是以下是一些適合您提供的文本的基於問題的標題: * **Go WaitGroup 和 Channels:為什麼我的程式不退出? ** ** * **陷入循環:如何使用 WaitGro 正確關閉 Go 中的通道的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn