WaitGroup是Go语言中的一个同步原语,用于等待一组goroutine的完成。
下面是一个简单的应用实例,演示了如何使用WaitGroup等待一组goroutine的完成:
package mainimport ("fmt""sync""time")// 模拟耗时操作,每个goroutine等待一秒钟func doSomething(i int, wg *sync.WaitGroup) {defer wg.Done()fmt.Printf("Goroutine %d start\n", i)time.Sleep(time.Second)fmt.Printf("Goroutine %d done\n", i)}func main() {var wg sync.WaitGroup// 启动5个goroutinefor i := 0; i < 5; i++ {wg.Add(1)go doSomething(i, &wg)}// 等待所有goroutine完成wg.Wait()fmt.Println("All goroutines done")}在上面的例子中,我们定义了一个doSomething函数来模拟耗时的操作。在main函数中,我们创建了一个WaitGroup,并在启动每个goroutine之前调用Add方法来增加计数器。
然后,每个goroutine执行doSomething函数,并在完成后调用Done方法来递减计数器。
最后,我们调用Wait方法来等待所有goroutine完成。一旦计数器归零,Wait方法将返回,程序继续执行。
运行上面的代码,你将看到类似以下的输出:
Goroutine 0 startGoroutine 1 startGoroutine 2 startGoroutine 3 startGoroutine 4 startGoroutine 0 doneGoroutine 2 doneGoroutine 3 doneGoroutine 4 doneGoroutine 1 doneAll goroutines done从输出中可以看出,所有的goroutine都已经完成,并且在最后打印了"All goroutines done"。
通过使用WaitGroup,我们可以方便地等待一组goroutine的完成,从而控制程序的执行顺序和并发度。这在并发编程中是非常常见和实用的技术。