总述

在实践中, 我们经常使用 goroutine pool 来减少 go func的内存分配和gc压力, 这次主要参考了 fasthttp、ants、tidb、jager tarsgo.

细节

  1. fasthttp: 参考前面的文章.
  2. ants: 主要参考了fasthttp的实现. 也是 worker数组的队列 + sync.Pool 的组合的方式, worker队列 也是 后进先出的处理方式. 不多叙述
  3. jager: 实现参考: 地址, 是通过一个 有界队列实现的, 开启多个任务goroutine, 和 队列 channel 交互, 获取队列 channel的任务进行执行.
  4. targo: 实现地址, Pool内部 维护了 worker队列 和 job队列, 每个 worker 内部维护了一个 job队列. 这样, 请求会先进入 pool的job队列, pool通过worker队列分发job, 将job分发到相应的 worker的 job队列, 每个worker在初始化的时候, 会启动一个goroutine不断从 job队列取出来执行.

对比

对比各种实现: - jager的实现, 比较粗糙, 限定死了 worker数量, 不能很好的处理并发量上来的情况, 但是也符合本身的定位, 一个 有界的队列 - fasthttp、ants 定位是 workerpool, 能够很好的处理流量尖峰, 有回收空闲goroutine的能力. - targo 的实现, 是一个简单的任务处理框架, 缺点是不能够scale out, 相比于 fasthttp 还是比较弱的.

补充

tidb本身也有pool的实现, 但是已经在后来的开发中移除了.