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