【问题标题】:Concurrency pattern: worker with variable number of results并发模式:具有可变数量结果的工作人员
【发布时间】:2019-01-02 08:47:36
【问题描述】:

我想在 golang 中创建一个工作池,将一个大任务划分为多个作业。

问题是例程可能会产生多个输出作为计算的结果,所以我无法提前知道我将在结果通道上迭代多少次。

我知道我可以使用 WaitGroup,但我想知道是否可以使用另一种模式,以便让主线程推进计算并迭代结果,而不是先等待每个例程完成。

我认为的另一个对我来说不是很优雅的解决方案是创建一个Result 结构或返回一个结果数组。由于我可以计算作品的数量,我知道我会收到多少个结果数组。

【问题讨论】:

  • 主线程(或任何正在读取结果的线程)可以在处理正在进行时从结果通道中读取结果,它不必等待所有工作人员完成才能开始处理结果.
  • 是的,但在某些时候它必须停止。我如何知道所有工人何时完成工作?
  • 你知道他们是通过使用等待组完成的。但是您可以使用等待组来选择何时停止寻找结果,而不是何时开始
  • 它看起来像一个切割器解决方案,但我刚刚检查了文档,现在可以查询 Wg 的值。也许我会使用像 AtomicInteger 这样的东西?同时谢谢你:)
  • 为什么需要查询值?大概你不想在所有工作人员完成之前停止读取结果,这正是 Done() 的用途。

标签: go design-patterns concurrency


【解决方案1】:

你可以这样做:

go func() {
    wg.Wait()
    close(results)
}()

for res := range results {
    // Handle results
}

当您的所有工作人员完成处理后,关闭结果通道。读取结果的进程将结束并退出循环。

【讨论】:

  • 太棒了!非常感谢
猜你喜欢
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多