我创建了以下简单程序来测试使用通道的扇入扇出模式。它的作用是生成一些 go 例程来计算来自输入通道的数字的平方,并将该平方发送到输出通道。然后,所有输出通道将合并到一个通道中,以在 中打印正方形。main
func calculateSquare(in <-chan int) <-chan int {
out := make(chan int)
go func() {
for num := range in {
fmt.Printf("Receving num %v\n", num)
out <- num * num
fmt.Printf("Sending square %v\n", num * num)
}
fmt.Println("Closing out")
close(out)
}()
return out
}
func fanOut(in <-chan int, workerCount int) []<-chan int {
outs := make([]<-chan int, 0, workerCount)
for i := 0 ; i < workerCount ; i++ {
outs = append(outs, calculateSquare(in))
}
return outs
}
func fanIn(outs []<-chan int) <-chan int {
var wg sync.WaitGroup
merge := make(chan int)
for _, out := range outs {
wg.Add(1)
go func() {
for result := range out {
merge <- result
}
wg.Done()
}()
}
go func() {
wg.Wait()
fmt.Println("Closing merge")
close(merge)
}()
return merge
}
func main() {
in := make(chan int)
go func() {
for i := 0 ; i < 4 ; i++ {
fmt.Printf("Sending num %v\n", i)
in <- i
}
close(in)
}()
outs := fanOut(in, 5)
merge := fanIn(outs)
for num := range merge {
fmt.Printf("Final square %v\n", num)
}
}
在函数中,我将4个数字0 -> 3发送到输入通道,我希望看到控制台中打印的4个正方形。但是,当我运行该程序时,即使输出有点波动,但我从未见过控制台中打印的4个平方数字。main
下面是我看到的示例输出。
Sending num 0
Sending num 1
Sending num 2
Sending num 3
Closing out
Receving num 0
Receving num 1
Receving num 2
Sending square 4
Closing out
Receving num 3
Final square 4
Closing merge
如果有人能向我解释为什么被印刷但永远不会来,我将不胜感激。此外,如果没有打印,频道是如何关闭的。我只看到2 ,但是,我合并结果的等待组结束了它。Receving num 1Sending square 1Sending square 1outputClosing outWait()
我一定是在某个地方做错了什么。
红颜莎娜
慕无忌1623718
相关分类