go - 同时收听一系列 go channel

标签 go channel goroutine

<分区>

假设我有一个 go 接收 channel 。有没有办法让我同时收听所有这些内容?例如:

channels := make([]<-chan int, 0, N)
// fill the slice with channels
for _, channel := range channels {
  <-channel
}

是我能做到的最接近的。但是,此实现取决于 slice 元素的顺序。

为清楚起见,我不需要知道 go channel 的值。我只需要知道他们都完成了。

最佳答案

您可以使用同步包来创建 WaitGroup 。 添加到 waitGroup 后,为每个 channel 启动一个 goroutine。 最后,当 channel 完成时,它会递减 waitGroup。调用者只是等待 WaitGroup 。这是 playground link .

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    wg       := sync.WaitGroup{}
    numChans := 10
    chans    := make([]chan interface{}, numChans)

    for i:=0;i<numChans;i++ {
      chans[i] = make(chan interface{})
      wg.Add(1) 
      go func(c chan interface{}) {
        defer wg.Done()     
        <-c 
      }(chans[i])
    }

    //simulate closing channels
    go func(){
       time.Sleep(time.Second)
       fmt.Println("closing")
        for _, ch := range chans{
            close(ch)
        }       
    }()

    fmt.Println("waiting")
    wg.Wait()
}

关于go - 同时收听一系列 go channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55036639/

相关文章:

string - 从字符串转换为整数

c# - WCF 协议(protocol)异常 : Bad Request 400 (related to http message size)

go - 在我的代码中安全完成 goroutines 的正确方法是什么?

go - 无法将 websocket 数据从 flutter 应用程序发送到服务器

arrays - 创建一个没有 make 的 Go slice

戈朗 : SetCookie doesn't update expiration

go - channel 数组的范围

go - 如何让 goroutines 使用匿名函数在循环中返回值

Go 的 sync.WaitGroup 丢失了其中一个响应

concurrency - Go 中互斥锁的问题