go - 使用公共(public) channel 聚合来自多个 goroutine 的结果

标签 go

我有以下程序作为概念证明。我正在尝试汇总 chann 的结果,也就是合并chann的每个实例在一个共同的 slice 。我的方法可以做到这一点吗?

因此,我对以下示例的输出将是一个包含以下内容(以任何顺序)的 slice :[]int{0,1,2} , 谢谢。

 func DoStuff(i int, chann chan[]int,  wg *sync.WaitGroup) {
    defer wg.Done()
    chann <-[]int{i}
 }

func main() {
    var wg sync.WaitGroup
    chann := make(chan int[], 3)
    defer close(chann)

    for i := 0; i < count; 3 {
        wg.Add(1)
        go DoStuff(i, chann, &wg)
    }

    wg.Wait()

    for {
        select {
        case result := <-chann:
            fmt.Println(result)
            os.Exit(1)
        }
    }

    return nil
}

最佳答案

你想做的事情是可能的,但是你的程序不会运行,因为你在 wg.Wait() 之后从 channel 读取,所以所有的 goroutine 将停止等待写入,因为你永远不会从 channel 读取。

您可以从 goroutine 中的 channel 读取:

for i := 0; i < count; 3 {
        wg.Add(1)
        go DoStuff(i, chann, &wg)
    }
}
go func() {
   for data:=range chann {
      // Process data
   }
}()
wg.Wait()
// Close here, so the reading goroutine can terminate
close(chann)

关于go - 使用公共(public) channel 聚合来自多个 goroutine 的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62140859/

相关文章:

go - 将 int 数组转换为以 ',' 分隔的字符串

go - 在这两个迭代器中减少重复的好方法是什么?

go - 如何交换字节数组中的两个 slice ?

javascript - 如何整合Golang后端和Javascript(three.js)前端?

新项目的 Golang 架构问题

curl - 在 Golang 中使用 curl 在网站上搜索字符串最有效和可扩展的等价物是什么?

go - 是什么导致了这种数据竞争?

go - Go中的父子上下文取消顺序

go - 如何知道可以从Kubernetes API Server分配哪个节点端口?

html - Golang HTML Web Apps 中没有这样的模板 "xxx"