相关疑难解决方法(0)

是否可以将多个通道复用为一个?

想法是在切片中具有可变数量的通道,将通过它们接收的每个值推送到单个通道中,并且在最后一个输入通道关闭时关闭该输出通道.这样的东西,但对于多个渠道超过两个:

func multiplex(cin1, cin2, cout chan int) {
    n := 2
    for {
        select {
        case v, ok := <-cin1:
            if ok {
                cout <- v
            } else {
                n -= 1
            }

        case v, ok := <-cin2:
            if ok {
                cout <- v
            } else {
                n -= 1
            }
        }

        if n == 0 {
            close(cout)
            break
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码避免了繁忙的循环,因为没有任何default情况,这是好的(编辑:它看起来像",ok"的存在使得select语句非阻塞而且循环很忙.但是为了示例的缘故,把代码想象成会阻止它.使用任意数量的输入通道也可以实现相同的功能吗?显然,这可以通过将切片成对地减少到单个通道来完成,但如果可能的话,我会对更简单的解决方案更感兴趣.

concurrency channel go

12
推荐指数
1
解决办法
5530
查看次数

同时收听多个 go 频道

假设我有一个 go 接收通道。有没有一种方法可以让我同时收听所有内容?例如:

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

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

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

channel go goroutine

1
推荐指数
1
解决办法
1998
查看次数

标签 统计

channel ×2

go ×2

concurrency ×1

goroutine ×1