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

时间:2018-02-07 08:43:23

标签: multithreading go goroutine

我构建了一个简单的goroutine工作池,其中有一些chan用于事件流,它完全正常。由于goroutines的性质,我开始问自己,通过这样做获得了什么,然后限制了并发工人。 gorutines他们自己没有任何状态,他们每次执行都会重复使用,以便保留它们的价值。

所以问题是,启动goroutines并重新使用它们或者只是总是创建一个新的并且只是限制同时创建/运行的数量是否有意义?

1 个答案:

答案 0 :(得分:1)

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

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

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

代码是共享的; 调度程序中的状态具有相当可忽略的成本 但是,goroutine保持可能重新创建的成本很高。

后一点可以用作保留goroutines的理由 在游泳池附近。但另一方面,大部分时间它都比较简单 汇集执行类似任务的goroutines资源组 重复使用 - 而不是goroutines本身。