Concurrency 以下是golang代码死锁。有人能帮助理解为什么吗?
这个例子取自。它运行并给出正确答案,但它显示以下运行时错误:“致命错误:所有goroutines都处于休眠状态-死锁!”。有人能帮我理解为什么会这样吗? 包干管Concurrency 以下是golang代码死锁。有人能帮助理解为什么吗?,concurrency,go,Concurrency,Go,这个例子取自。它运行并给出正确答案,但它显示以下运行时错误:“致命错误:所有goroutines都处于休眠状态-死锁!”。有人能帮我理解为什么会这样吗? 包干管 import ( "fmt" ) func gen(nums ...int) <- chan int { out := make(chan int) go func() { for _, n := range nums { out <- n }
import (
"fmt"
)
func gen(nums ...int) <- chan int {
out := make(chan int)
go func() {
for _, n := range nums {
out <- n
}
}()
return out
}
func sq(in <- chan int) <- chan int {
out := make(chan int)
go func() {
for n := range in {
out <- n * n
}
close(out)
}()
return out
}
func main() {
for n := range sq(gen(2,3)) {
fmt.Println(n)
}
}
导入(
“fmt”
)
func-gen(nums…int)函数的sq()
中的n:=范围永远不会退出,并开始阻塞(读取2个值后),因为gen()
从未关闭其通道。
将close(out)
添加到gen()
的go func
将使其工作:
对于信道,接收器阻塞,直到接收到一个值。
.
sq()
在第二个示例中,main()
本身退出,这意味着即使sq()
被阻止,一切仍然停止
func main() {
// Set up the pipeline.
c := gen(2, 3)
out := sq(c)
// Consume the output.
fmt.Println(<-out) // 4
fmt.Println(<-out) // 9
}