golang你不得不知道的事

Goroutine的并发控制

2021-03-14  本文已影响0人  超鸽带你飞

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

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方式限制协程数量

上一篇下一篇

猜你喜欢

热点阅读