今天学了go的并发,go并发的时候,可能会产生很多个goroutine,过程是不可控的,所以控制并发至关重要,WaitGroup是一种控制并发的方式,控制多个协程同时完成。用一个简单的例子说明一下:
package main import ( "sync" "time" "fmt" ) func main(){ var wg sync.WaitGroup //定义一个,可看成一个队列 wg.Add(2) //向队列中加两个协程 go func() { time.Sleep(2*time.Second) fmt.Println("1号完成") wg.Done() //完成一个后,减一 }() go func() { time.Sleep(2*time.Second) fmt.Println("2号完成") wg.Done() }() wg.Wait() 阻塞程序,直到队列中的所有任务全部完成时解除阻塞 fmt.Println("全部完成") }
结果:
D:\gowork\src\learn\12\1>go run waitgroup.go
2号完成
1号完成
全部完成
sync.WaitGroup中只有三个方法,用来控制并发。Add()添加计时;Done()完成一个任务时减一;Wait()阻塞,直到队列中所有任务完成,即Add(0);阻塞接触才会继续下面的程序,才能保证所有协程同时完成