我想运行多个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))
答案 0 :(得分:2)
答案 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
}