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

如何从多个goroutine写入同一通道,go,concurrency,Go,Concurrency,我需要几个goroutine在同一频道中写入。然后在一个位置读取所有数据,直到所有goroutine完成该过程。但我不知道如何最好地关闭这个频道 这是我的示例实现: func main() { ch := make(chan data) wg := &sync.WaitGroup{} for instance := range dataSet { wg.Add(1) go doStuff(ch, instance) }

我需要几个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
}
func main(){
ch:=制造(成龙数据)
wg:=&sync.WaitGroup{}
例如:=范围数据集{
工作组.添加(1)
go doStuff(ch,实例)
}
go func(){
wg.Wait()
关闭(ch)
}()
对于v:=范围ch{//range直到它关闭
//继续进行
}
}
func doStuff(通道数据、实例数据){
//用实例做一些事情。。。

ch当您使用
WaitGroup
并在启动新goroutine时增加计数器时,您必须在goroutine完成时通过调用
Done()通知
WaitGroup
方法。您还必须将相同的
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()
}
func main(){
ch:=制造(成龙数据)
wg:=&sync.WaitGroup{}
对于u,实例:=范围数据集{
工作组.添加(1)
go doStuff(ch、实例、工作组)
}
go func(){
wg.Wait()
关闭(ch)
}()
对于v:=范围ch{//range直到它关闭
//继续进行
}
}
func doStuff(ch chan数据、实例数据、wg*sync.WaitGroup){
//用实例做一些事情。。。

ch只有一种方法可以写入通道,因此只有一种方法可以从多个goroutine写入通道,那就是从多个goroutine写入通道。因此,我不太理解您的问题。您所做的非常好。请参阅可能的重复:。通常,发件人应该关闭通道。如果有多个发送者,你需要协调才能在一个地方关闭频道,只有一次,并且只有当所有发送者都完成了他们的工作时。你在代码中忘记了一件事:
doStuff()
应该调用
wg.done()
,最好是延迟。谢谢!是的,我的方式很好(当然,有
wg.done())
不存在)。我只想知道它是惯用语?还是有更优雅的方式存在?