在并发编程中,控制同时执行的 goroutine 数量至关重要。一种方法是使用缓冲通道作为信号量。然而,在等待信号量完全耗尽时会出现一个常见问题。
假设我们有一个整数切片要同时处理,限制为两个并发去例行公事。我们使用缓冲通道作为信号量来强制执行此限制。虽然代码适用于大多数整数,但由于缓冲区永远不会达到空,程序在最后一个 go 例程完成之前提前退出。
我们如何等待缓冲通道完全排空,确保所有 go 例程在程序退出之前完成?
使用通道由于缺乏无竞争的方法来检查其长度,等待特定条件是不可行的。相反,我们可以使用sync.WaitGroup来监控所有goroutines的完成。
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完成之前程序退出,确保所有处理完成。
以上是使用缓冲通道作为信号量时如何确保所有 Goroutines 完成?的详细内容。更多信息请关注PHP中文网其他相关文章!