【问题标题】:Worker pool that reads and writes to same channel go读取和写入同一通道的工作池
【发布时间】:2019-04-29 11:38:03
【问题描述】:

我需要你的帮助。目前我正在尝试创建一个工作池,它从一个通道读取连续作业,然后将结果生成到它正在读取的同一通道,然后工作并将结果生成到同一通道。你得到的想法有点像递归。有没有办法让这成为可能? 我真的很感谢您对设计模式的建议,以使用 go 例程作为工作程序池和通道来读取作业,然后从同一个工作程序池将该工作的结果写入同一个通道以继续工作。谢谢你。

【问题讨论】:

  • 您为什么要在同一频道上发布结果/已完成的工作?如果你这样做,其他工作人员可能会接受它(他们会用它做什么?无论如何,完成它的原始工作人员也可以在没有重新发送/接收开销的情况下做到这一点)。如需推荐,请查看:Is this an idiomatic worker thread pool in Go?

标签: algorithm go recursion channel goroutine


【解决方案1】:

没有理由不能(从 Go 的角度)在阅读后写回通道:

func Foo(c chan int) {
  x := <-c
  // do something to x
  c <- x
}

这很奇怪……老实说,我不推荐它。通常我看到一个系统由几个通道组成,数据被向下传递而不进入循环。考虑树而不是图表。

【讨论】:

  • 感谢您的回复。我正在解决一个应该使用递归但会导致内存问题的问题。所以我决定尝试实现一个工作池来不断地从一个通道接收工作,完成工作,然后将该值传递回它正在接收的同一个通道,如果一个工作人员找到了这个值,那么我希望他们都能够优雅地退出。我在试图找出在不处理死锁问题的情况下定义此模式的最佳方法时遇到了问题。真的很感激一些方向谢谢你提前
  • 你使用的是缓冲通道吗?
  • 我目前正在试验两者。并且使用缓冲通道获得了更好的结果。
  • 缓冲通道可能会更好地为您工作,因为相同的 go 例程正在读取写作
  • 谢谢!一旦找到结果,关于如何优雅地结束 go 例程的任何建议?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 2016-02-11
  • 2014-04-28
  • 2011-03-09
相关资源
最近更新 更多