等待缓冲通道耗尽
在提供的代码中,缓冲通道用作信号量来限制并发数量运行 goroutine。然而,如果没有明确的机制来等待通道耗尽,主程序可能会在所有 goroutine 执行完毕之前终止。
问题:
如何确保程序会等待所有 goroutine 完成之前退出?
答案:
为此目的使用信号量(通道)并不理想,因为没有内置方法来检查通道的长度并等待它达到 0。要正确等待 goroutine 完成,请考虑使用同步原语,例如sync.WaitGroup.
更新的代码:
sem := make(chan struct{}, 2) var wg sync.WaitGroup for _, i := range ints { wg.Add(1) // acquire semaphore sem <- struct{}{} // start long running go routine go func(id int) { defer wg.Done() // do something // release semaphore <-sem }(i) } wg.Wait()
sync.WaitGroup 维护未完成任务的计数(在本例中为 goroutine) 。这允许主程序等待所有任务完成。 wg.Add(1) 在启动新的 goroutine 之前增加任务计数,而 wg.Done() 在 goroutine 完成时减少计数。 wg.Wait() 调用会阻塞主程序,直到任务计数达到 0,确保所有 goroutine 在程序退出之前都已完成。
以上是使用缓冲通道作为信号量时,如何确保所有 Goroutine 在程序退出之前完成?的详细内容。更多信息请关注PHP中文网其他相关文章!