如何从多个goroutine写入同一通道

时间:2019-05-22 08:43:07

标签: go concurrency

我需要几个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
}

但是我不确定它是惯用语言。

1 个答案:

答案 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()
}