WaitGroup是Go语言中的一个同步原语,用于等待一组goroutine的完成。
下面是一个简单的应用实例,演示了如何使用WaitGroup等待一组goroutine的完成:
package main import ( "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个goroutine for 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 start Goroutine 1 start Goroutine 2 start Goroutine 3 start Goroutine 4 start Goroutine 0 done Goroutine 2 done Goroutine 3 done Goroutine 4 done Goroutine 1 done All goroutines done 从输出中可以看出,所有的goroutine都已经完成,并且在最后打印了"All goroutines done"。
通过使用WaitGroup,我们可以方便地等待一组goroutine的完成,从而控制程序的执行顺序和并发度。这在并发编程中是非常常见和实用的技术。