Closing a Channel After Goroutines Completion
When working with goroutines and channels in Go, it is often necessary to determine when all goroutines have finished executing and close the channel accordingly. Two common approaches are presented in the question: explicitly closing the channel after spawning goroutines and using thread counting.
Explicit Channel Closure
The first approach involves closing the channel after all goroutines are created. However, it is possible that the channel is closed prematurely, preventing goroutines from sending their results.
Thread Counting
In the second approach, a thread count is maintained, and the channel is closed when the count reaches zero. While functional, it relies on sleep calls or busy waiting, which can be inefficient.
Sync.WaitGroup Solution
A more efficient and reliable way to accomplish this task is to use the sync.WaitGroup type. WaitGroup allows waiting on a specific number of tasks, regardless of their completion order. Modifying the original example to use a WaitGroup would look like this:
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...) } }
This approach allows the goroutines to complete their tasks before closing the channel, ensuring that all expected messages are received.
The above is the detailed content of How to Reliably Close a Go Channel After All Goroutines Finish?. For more information, please follow other related articles on the PHP Chinese website!