【问题标题】:Does a goroutine pool make sense like thread pools in other languages?goroutine 池是否像其他语言中的线程池一样有意义?
【发布时间】:2018-02-07 08:43:23
【问题描述】:

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

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

【问题讨论】:

  • 这太宽泛了,无法给你一个好的答案。通常,goroutine 非常轻量级,因此重用它们几乎没有优势。如果您想对一次处理的事物数量进行速率限制,使用其他机制(普通计数器)比使用工作池更容易。
  • 不,它没有。协程的整个想法是摆脱对池的需求。

标签: multithreading go goroutine


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 问题直截了当地指出“他们自己的 gorutines 没有任何他们在每次执行时重用的状态”。
  • @Adrian,我要直截了当地告诉你一件好事:StackOverflow 不仅作为问答服务存在,而且作为人们可以搜索现有答案的平台而存在。大多数人为此使用谷歌,但无论他们如何搜索,搜索都使用关键字来查找相关材料。这就是为什么——在我的书中——以通用的方式回答问题会有所帮助。总而言之,我的回答提供了足够的一般信息来完全解决范围更窄的原始答案。
  • 天哪,超级整洁,你是对的!如果您想回答的问题比被问到的要多,那太好了!只需说“看起来这可能不适用于您当前的情况,但是……”这样提问者就可以很容易地分辨出哪些部分正在回答他们的问题,哪些部分只是您认为某天有人可能会发现有用的东西。
猜你喜欢
  • 2015-09-30
  • 1970-01-01
  • 2013-08-05
  • 2017-08-17
  • 2018-07-19
  • 2017-05-08
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多