Goroutine 完成後關閉Channel
在Go 中使用Goroutine 和Channel 時,通常需要確定所有Goroutines 何時完成地執行並何時完成地執行關閉通道。問題中提出了兩種常見的方法:在產生 goroutine 後明確關閉通道並使用線程計數。
明確通道關閉
第一種方法涉及在所有 goroutine 均已建立。但是,通道可能會過早關閉,從而阻止 goroutine 發送結果。
執行緒計數
在第二種方法中,維護執行緒計數,當計數達到零時通道關閉。雖然功能正常,但它依賴睡眠呼叫或忙碌等待,這可能效率低下。
Sync.WaitGroup 解決方案
完成此任務的更有效和可靠的方法是使用sync.WaitGroup類型。 WaitGroup 允許等待特定數量的任務,無論其完成順序為何。修改原始範例以使用 WaitGroup 如下所示:
import ( "sync" ) func main() { var wg sync.WaitGroup for i := 0; i <= 10; i++ { wg.Add(1) go func() { result := calculate() c <- result wg.Done() }() } // Close the channel when all goroutines are finished go func() { wg.Wait() close(c) }() for result := range c { all_result = append(all_result, result...) } }
這種方法允許 goroutine 在關閉通道之前完成其任務,確保收到所有預期的訊息。
以上是如何在所有 Goroutine 完成後可靠地關閉 Go Channel?的詳細內容。更多資訊請關注PHP中文網其他相關文章!