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

原创
09/14 14:32
阅读数 113
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()
}
展开阅读全文
go
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部