go - 同时收听 Go 通道数组
问题描述
假设我有一部分去接收频道。有什么方法可以让我一次全部听完吗?例如:
channels := make([]<-chan int, 0, N)
// fill the slice with channels
for _, channel := range channels {
<-channel
}
是我能做到的最接近的。但是,此实现取决于切片元素的顺序。
为清楚起见,我不需要知道 go 通道的值。我只需要知道他们都完成了。
解决方案
您可以使用同步包来创建等待组。添加到 waitGroup 后,为每个通道启动一个 goroutine。最后,当通道完成时,它会减少 waitGroup。调用者只是在等待组上等待。这是操场链接。
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()
}
推荐阅读
- c - 了解 printf 中的段错误行为
- python - 如何比 .append 更快地构建列表?
- css - 如何使用flexbox修复页眉而不是页脚?
- java - 生成随机 ARGB 图像不会生成可打开的图像
- code-signing - Comodo - 签名代码 - 时间戳问题
- javascript - owl-carousel 的问题始于延迟
- npm - 在 bitbucket 管道中执行命令后需要插入用户名和密码
- python - 制作 pandas Multiindex 数据帧比追加更快的方法
- c++ - Libcurl 没有给出响应但详细模式显示服务器发送了一个
- google-bigquery - Airflow BigQuery Hook - 通过 run_query 运行更新查询