【发布时间】:2019-10-08 16:47:14
【问题描述】:
我需要几个 goroutine 在同一个频道中编写。然后在一个地方读取所有数据,直到所有 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
}
但我不确定它是否惯用。
【问题讨论】:
-
只有一种方式可以写入通道,因此从多个 goroutine 写入通道只有一种方式,即从多个 goroutine 写入通道。所以我不太明白你的问题。
-
你所做的一切都很好。查看可能的重复项:Closing channel of unknown length。一般来说,发送者应该关闭通道。如果有多个发件人,您需要协调以仅在一个地方关闭通道,仅一次,并且仅在所有发件人都完成工作时才关闭。
-
您在代码中忘记的一件事:
doStuff()应该调用wg.Done(),最好是延迟。 -
谢谢!是的,我的方法很好(当然,有
wg.Done()缺席)。我只想知道它是惯用的吗?还是有更优雅的方式存在?
标签: go concurrency