登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-18 14:54:29 262浏览 收藏

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题《如何从多个 goroutine 写入同一通道》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!

问题内容

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

但我不确定这是否符合习惯。


解决方案


由于您正在使用 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()
}

好了,本文到此结束,带大家了解了《如何从多个 goroutine 写入同一通道》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>