Multithreading goroutine池和其他语言中的线程池一样有意义吗?

Multithreading goroutine池和其他语言中的线程池一样有意义吗?,multithreading,go,goroutine,Multithreading,Go,Goroutine,我为一个事件流构建了一个简单的goroutine工作池,其中包含一些chan,效果非常好。由于goroutines的性质,我开始问自己,除了限制并发工作人员之外,我还能从中获得什么。gorutines本身没有任何状态,它们在每次执行时都会重用,因此保留它们是有价值的 所以问题是,启动并重用goroutine,或者总是创建一个新的goroutine,并限制在同一时间创建/运行的数量,这样做有意义吗?因为goroutine是一个执行函数,它可以被认为包含以下资源集: 它执行的代码 Go运行时调度器

我为一个事件流构建了一个简单的
goroutine
工作池,其中包含一些
chan
,效果非常好。由于goroutines的性质,我开始问自己,除了限制并发工作人员之外,我还能从中获得什么。
gorutines
本身没有任何状态,它们在每次执行时都会重用,因此保留它们是有价值的

所以问题是,启动并重用goroutine,或者总是创建一个新的goroutine,并限制在同一时间创建/运行的数量,这样做有意义吗?

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

  • 它执行的代码
  • Go运行时调度器为该goroutine维护的状态
  • 属于戈罗廷的私人的州
后者是goroutine在本地分配的值 (在堆栈上)和堆上

代码共享; 调度器中的状态的成本可以合理地忽略不计 但goroutine保留的州可能需要花费高昂的重建成本

后一点可以作为保留goroutines的理由 在游泳池里。但另一方面,大多数情况下它更简单 汇集执行类似任务的goroutine组的资源
重复使用-而不是goroutines本身。

这太宽泛了,无法给你一个好的答案。一般来说,goroutine非常轻量级,因此重用它们没有什么优势。如果您想限制一次处理的事情数量,那么使用其他机制(普通计数器)比使用工作池更容易。不,不是这样。协同程序的整个想法是为了摆脱对池的需求。问题直截了当地说“gorutines本身没有任何状态,它们每次执行时都会重复使用”。@Adrian,有一件巧妙的事情我要直截了当地告诉你:StackOverflow不仅作为问答服务存在,而且作为一个平台,人们可以在其中搜索现有的答案。大多数人使用谷歌搜索,但无论他们如何搜索,搜索都使用关键词来查找相关资料。这就是为什么在我的书中,用一般的方式回答问题会有所帮助。总而言之,我的答案提供了足够的一般信息,可以完全解决范围更窄的原始答案。天哪,这太好了,你说得对!如果你想回答更多的问题,那太好了!只要说“看起来这可能不适用于你目前的情况,但是……”这样提问者就可以很容易地分辨出哪些部分在回答他们的问题,哪些部分正是你认为有一天有人会发现有用的东西。