首先需要区分下协程池和线程池,题主提到的 goroutine pool 是协程池,一般是控制协程数量,复用协程,避免协程无限增长。当然协程最终还是使用的系统线程(G -P -M),避免协程无限增长,根本上还是避免系统线程的无限增长。

说白了,”池“通常是为了能够复用,降低资源开销。比如对象池(Go 的 sync.Pool)是为了复用已有对象,避免内存的频繁申请和带来的 GC 开销。所以就算 Go 有 GPM 模型,在一些情况下,也是需要通过池来复用系统线程,降低系统开销的。