同时收听一系列go频道[复制]

问题描述 投票:1回答:1

这个问题在这里已有答案:

假设我有一段接收频道。有没有办法可以同时收听所有这些内容?例如:

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

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

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

go channel goroutine
1个回答
3
投票

您可以使用同步包来创建等待组。添加到waitGroup后,为每个通道启动goroutine。最后,当通道完成时,它会减少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()
}
© www.soinside.com 2019 - 2024. All rights reserved.