一个完成后如何完成所有goroutine

时间:2018-05-18 09:25:53

标签: go

我想运行多个goroutine,进行一些处理,将结果放入通道,当至少有一个goroutine完成时,完成所有其他并从通道返回结果。

所以,我尝试使用等待组实现这一点,但似乎我还没有正确使用等待组。

df1 <- structure(list(Name = c("A", "A", "A", "A", "B", "B", "B", "C", 
"D", "D"), Date = c("2008-04", "2008-06", "2009-05", "2010-04", 
"2005-04", "2006-05", "2010-08", "2012-05", "2016-05", "2017-05"
 ), Value = c(-0.5, 3, -0.8, -0.6, 2, 2, -1, 2, 5, 6)),
 class =   data.frame", row.names = c(NA, -10L))

2 个答案:

答案 0 :(得分:2)

执行此操作的最佳方法是使用context。有一个很好的例子,说明如何在Go blog上准确地解决您的问题类型。

答案 1 :(得分:1)

您发布的代码不是可编译的,您也没有描述问题(会发生什么而不是预期的结果),但通过查看代码我有两个建议:

使结果通道缓冲,长度为1:

results := make(chan *models.Receipt, 1)

这允许首先完成的goroutine将结果写入通道并退出,从而减少waitgroup的计数器。

最后,您应该使用isCalculated.Set()而不是SetToIf,这样您就不会将标志/结果设置两次(因此停止,因为读者仍在等待等待组“完成“所以第二个goroutine将无法写入通道,这意味着waitgroup永远不会达到零):

log.Println("Writing result to channel...")
if isCalculated.SetToIf(false, true) {
   results <- receipt
}