Golang控制并发有两种经典的方式,一种是WaitGroup,另外一种就是Context。

cancel是主动停止协程(不管是否执行完毕),而WaitGroup是协程执行完毕后自己主动结束的

WaitGroup 方式:

var wg sync.WaitGroup

func fun1(i chan int)  {
       time.Sleep(2 * time.Second)
       fmt.Println(<-i)
       wg.Done()
}

func main()  {
       wg.Add(2)
       ch1 := make(chan int)
       ch2 := make(chan int)

       go fun1(ch1)
       go fun1(ch2)

       ch1 <- 1
       ch2 <- 2

       wg.Wait()
       fmt.Println("全部 goroutine 运行结束")
}

Context 方式:

func main()  {
       ctx,cancel := context.WithCancel(context.Background())
       go watch(ctx,"监控一")
       go watch(ctx,"监控二")
       go watch(ctx,"监控三")

       time.Sleep(6 * time.Second)
       fmt.Println("结束监控")
       cancel()

       time.Sleep(2*time.Second)

}

func watch(ctx context.Context,name string)  {
       for {
              select {
              case <- ctx.Done():
                     fmt.Println(name+"监控结束,退出")
                     return
              default:
                     fmt.Println(name+"监控中")
                     time.Sleep(2*time.Second)
              }
       }
}