【发布时间】:2019-01-02 08:47:36
【问题描述】:
我想在 golang 中创建一个工作池,将一个大任务划分为多个作业。
问题是例程可能会产生多个输出作为计算的结果,所以我无法提前知道我将在结果通道上迭代多少次。
我知道我可以使用 WaitGroup,但我想知道是否可以使用另一种模式,以便让主线程推进计算并迭代结果,而不是先等待每个例程完成。
我认为的另一个对我来说不是很优雅的解决方案是创建一个Result 结构或返回一个结果数组。由于我可以计算作品的数量,我知道我会收到多少个结果数组。
【问题讨论】:
-
主线程(或任何正在读取结果的线程)可以在处理正在进行时从结果通道中读取结果,它不必等待所有工作人员完成才能开始处理结果.
-
是的,但在某些时候它必须停止。我如何知道所有工人何时完成工作?
-
你知道他们是通过使用等待组完成的。但是您可以使用等待组来选择何时停止寻找结果,而不是何时开始。
-
它看起来像一个切割器解决方案,但我刚刚检查了文档,现在可以查询 Wg 的值。也许我会使用像 AtomicInteger 这样的东西?同时谢谢你:)
-
为什么需要查询值?大概你不想在所有工作人员完成之前停止读取结果,这正是 Done() 的用途。
标签: go design-patterns concurrency