Goroutine池

问题提出

场景一

维持长链接,为每个长链接分配三个goroutine

  • 一个负责读数据
  • 一个负责写数据
  • 一个负责维持心跳

高并发场景,goroutine的数量会是连接数的三倍!

golang号称可以百万级别并发,但goroutine也不应该无限制的创建吧,毕竟每次都向系统申请内存,系统内存总有耗尽的一天。

无休止的开辟Goroutine依然会出现高频率的调度Groutine,那么依然会浪费很多上下文切换的资源,导致做无用功。所以设计一个Goroutine池限制Goroutine的开辟个数在大型并发场景还是必要的。

场景二

数据库查询模块,希望并发控制到40

  1. 如果请求少于40个请求那么就执行查询
  2. 1个查询完了就释放席位(也就是一共n个任务,1个查完了,那么还能再提交40-n+1个任务)
  3. 如果请求过多于40个就阻塞,直到有任务退出腾出席位

goroutine池实现

深入浅出Golang的协程池设计 Golang worker pool 实现


分享: