WaitGroup用法
1 Add()用来设置要等待的goroutine的数量,不能为负,Done()用来表示goroutine已经完成了,减少一次计数器,Wait()用来等待所有需要等待的goroutine完成。特别注意这个传递的时候要传指针,传值的话是错误的,
package main import ( "fmt" "sync" "time" ) // 这里的接收参数必须是指针,因为三个goroutine要共用一个计数器, // 如果不是指针,每个goroutine都会拷贝一份, 这样会造成死锁, func process(i int, wg *sync.WaitGroup) { fmt.Println("started Goroutine ", i) time.Sleep(2 * time.Second) fmt.Printf("Goroutine %d ended\n", i) wg.Done() } func main() { no := 3 var wg sync.WaitGroup for i := 0; i < no; i++ { // 添加要监控的goroutine的个数, wg.Add(1) go process(i, &wg) } // 若wg中监控的goroutine个数不为0,则会阻塞当前goroutine, wg.Wait() fmt.Println("All go routines finished executing") }