我需要几个goroutines在同一通道中编写。然后,所有数据都集中在一个位置,直到所有goroutine完成该过程为止。但是我不确定如何最好地关闭此频道。
这是我的示例实现:
func main() {
ch := make(chan data)
wg := &sync.WaitGroup{}
for instance := range dataSet {
wg.Add(1)
go doStuff(ch, instance)
}
go func() {
wg.Wait()
close(ch)
}()
for v := range ch { //range until it closes
//proceed v
}
}
func doStuff(ch chan data, instance data) {
//do some stuff with instance...
ch <- instance
}
但是我不确定它是惯用语言。
答案 0 :(得分:1)
当您使用WaitGroup
并在启动新的goroutine时增加计数器时,您必须通过调用WaitGroup
方法在goroutine完成时通知Done()
。另外,您还必须将相同的WaitGroup
传递给goroutine。您可以通过传递WaitGroup
的地址来实现。否则,每个goroutine将使用自己的WaitGroup
,它们将在不同的范围内。
func main() {
ch := make(chan data)
wg := &sync.WaitGroup{}
for _, instance := range dataSet {
wg.Add(1)
go doStuff(ch, instance, wg)
}
go func() {
wg.Wait()
close(ch)
}()
for v := range ch { //range until it closes
//proceed v
}
}
func doStuff(ch chan data, instance data, wg *sync.WaitGroup) {
//do some stuff with instance...
ch <- instance
// call done method to decrease the counter of WaitGroup
wg.Done()
}