我已经从GO Concurrency编写了一些代码示例:
func gen(numbers ...int) <-chan int {
out := make(chan int)
go func() {
for _, number := range numbers {
out <- number
}
close(out)
}()
return out
}
func sq(in <-chan int) <-chan int {
out := make(chan int)
go func() {
for number := range in {
out <- number * number
}
}()
return out
}
所以我试图在我的主要功能中使用上述代码,如下所示:
func main() {
result := sq(sq(sq(gen(1, 2, 3, 4))))
fmt.Println(<-result)
fmt.Println(<-result)
fmt.Println(<-result)
fmt.Println(<-result)
fmt.Println("-------------------")
for channelValue := range sq(sq(sq(gen(1, 2, 3, 4)))) {
fmt.Println(channelValue)
}
}
当我运行代码时,我很困惑,在循环后收到以下消息:
致命错误:所有goroutine都处于睡眠状态-死锁
请帮助我理解这一点。据我了解,调用fmt.Prinlnt(result)
x 4次与for循环on相同for channelValue := range sq(sq(sq(gen(1, 2, 3, 4))))
。这样对吗?
请告诉我为什么循环后会死锁吗?
通道范围超出范围,因为通道未以平方为单位关闭。
func sq(in <-chan int) <-chan int {
out := make(chan int)
go func() {
for number := range in {
out <- number * number
}
close(out)
}()
return out
}
调试此类死锁的一种好方法是向进程发送SIGQUIT。收到SIGQUIT时,运行时将转储所有goroutine的堆栈。堆栈转储通常会指出问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句