我需要多个 goroutines 在同一个 channel 中写入。然后所有的数据都在一个地方读取,直到所有的 goroutines 完成这个过程。但我不确定关闭此 channel 的最佳方式。
这是我的示例实现:
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
}
但我不确定它是不是惯用的。
最佳答案
由于您正在使用 WaitGroup
并在启动新 goroutine 时增加计数器,因此您必须在 goroutine 完成时通过调用 通知
方法。您还必须将相同的 WaitGroup
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()
}
关于go - 如何从多个 goroutine 写入同一个 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56252711/