goroutine 池是否像其他语言中的线程池一样有意义?

Does a goroutine pool make sense like thread pools in other languages?

我构建了一个简单的 goroutine 工作池,其中有几个 chan 用于事件流,它工作得很好。由于 goroutines 的性质,我开始问自己这样做除了限制并发工作人员之外还有什么收获。 gorutines 他们自己没有任何他们在每次执行时重用的状态,因此将它们保留在身边是有价值的。

所以问题是,启动 goroutines 并重复使用它们,还是总是创建一个新的,同时将可能的数量限制在 create/run 是否有意义?

由于 goroutine 是一个 执行函数, 它可以被认为包含以下资源的集合:

  • 它执行的代码;
  • Go 运行时调度程序为该 goroutine 维护的状态;
  • goroutine 私有的状态。

后者是 goroutine 在本地分配的值 (在其堆栈上)和堆上。

代码已分享; 调度器中的状态成本可以忽略不计 但是 goroutine 保持的状态 可能 重新创建的成本很高。

后一点可以作为保留goroutines的理由 在一个游泳池周围。但另一方面,大多数时候它更简单 汇集执行类似任务的 goroutines 资源组 重用——而不是 goroutines 本身。