Goroutine的并发控制

模拟一下协程数量太多的危害:

func main() {
  number := math.MaxInt64
  for i := 0; i < number; i++ {
    go func(i int) {
      // 做一些业务逻辑处理
      fmt.Printf("go func: %d\n", i)
      time.Sleep(time.Second)
    }(i)
  }

number过大,服务器系统资源利用率不断上涨,到最后程序自动killed

协程池解决?

池化要解决的问题①是频繁创建的开销,②是在等待时占用的资源。

goroutine没必要协程池!原因如下:

  1. goroutine 和普通线程相比,创建和调度都不需要进入内核,也就是创建的开销已经解决了。同时
  2. 相比系统线程,内存占用也是轻量的。所以池化技术要解决的问题goroutine 都不存在

通过channel和sync方式限制协程数量

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容