Go语言中的WaitGroup
是一种并发原语,用于等待一组goroutine的完成。它提供了三个方法:Add()
,Done()
和Wait()
。
Add(delta int)
:向计数器添加或减去给定的值。delta可以为负数。Done()
:减少计数器的值,相当于Add(-1)
。Wait()
:阻塞调用它的goroutine,直到计数器的值变为0。
WaitGroup
的实现比较简单,它本质上是一个计数器,其初始值为0。当我们调用Add()
方法时,计数器增加指定数量的值;当我们调用Done()
方法时,计数器减少1;当计数器的值变为0时,阻塞在Wait()
方法上的goroutine将被唤醒。具体来说,Wait()
方法会进入一个for循环,不断地检查计数器的值是否为0,如果不是则继续阻塞,如果是则立即返回。在Wait()
方法内部,使用了一个内置的信号量来实现线程同步。
此外,WaitGroup
的实现还有以下特点:
Add()
方法可以在多个goroutine中并发调用;Done()
方法只能在调用Add()
方法之后才能调用;- 单个
WaitGroup
实例不能重复使用,需要重新创建。
总之,WaitGroup
提供了一种便捷的机制来等待一组goroutine的完成。它的实现简单而高效,可以应用于各种并发场景。