使用 sync 包中的 WaitGroup 对象,对协程量计数,通过标记协程完成数量确定协程是否全部完成。

package main

import (
	"fmt"
	"math/rand"
	"sync"
	"time"
)

var wg sync.WaitGroup

func Pi(i int){
	// 执行结束前提示协程关闭一个
	defer wg.Done()
	// 设置协程每次不定时长的等待
	wait_time := rand.Intn(5)
	time.Sleep(time.Second * time.Duration(wait_time))
	fmt.Printf("runing %v (sleep %v s)\n", i, wait_time)
}

func main() {
	for i:=1; i<5; i++ {
		wg.Add(1)
		// 创建协程
		go Pi(i)
	}
	// 等待协程结束
	wg.Wait()
}