使用带缓冲区的 channel 控制 goroutine 协程的并发量

2021-09-23 11:52:55 浏览数 (2)

代码语言:javascript复制
func cc() {
   c := make(chan struct{}, 2) // 带缓冲区的channel
   var wg sync.WaitGroup
   wg.Add(10)
   for i := 0; i < 10; i   {
      go func(i int) {
         defer func() {
            if err := recover(); err != nil {
               fmt.Println("err", err)
               debug.PrintStack()
            }
         }()
         c <- struct{}{} // 往channel中添加
         defer wg.Done() // 完成一个wg
         defer func() {
            fmt.Println("goroutine: ", i)
            <-c // 无论是否有painc都消费一个channel
         }()

         if i == 3 {
            panic("*********** panic ***********")
         }

         time.Sleep(10 * time.Millisecond)

         if i == 3 {
            fmt.Println("####### 3 ######")
         }
      }(i)
      fmt.Println("for i :", i)
   }
   wg.Wait()
}

0 人点赞