【发布时间】:2012-06-14 07:53:29
【问题描述】:
这个想法是在一个切片中拥有可变数量的通道,将通过它们接收到的每个值推送到单个通道中,并在最后一个输入通道关闭后关闭此输出通道。像这样,但对于两个以上的频道:
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
}
}
}
上面的代码避免了忙循环,因为没有default case,这很好(编辑:看起来“,ok”的存在使得select语句非阻塞并且循环毕竟是忙的。但是为了这个例子,把代码想象成它会阻塞)。是否也可以通过任意数量的输入通道来实现相同的功能?显然,这可以通过将切片成对地减少到单个通道来完成,但如果可能的话,我会对更简单的解决方案更感兴趣。
【问题讨论】:
标签: concurrency go channel