[英]How to write to the same channel from multiple goroutines
我需要幾個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
}
但我不確定這是慣用語言。
當您使用WaitGroup
並在啟動新的goroutine時增加計數器時,必須在WaitGroup
完成時通過調用Done()
方法通知WaitGroup
。 另外,您必須將相同的WaitGroup
傳遞給goroutine。 您可以通過傳遞WaitGroup
的地址來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()
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.