gpt4 book ai didi

go - for循环导致死锁

转载 作者:IT王子 更新时间:2023-10-29 02:32:48 26 4
gpt4 key购买 nike

我已经从 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)
}

}

当我运行代码时我很困惑我在循环后得到了这条消息:

fatal error: all goroutines are asleep - deadlock

请帮助我理解这一点。据我了解,调用 fmt.Prinlnt(result) x 4 次与 for channelValue := range sq(sq(sq(gen(1, 2) 上的 for 循环相同, 3, 4))))。这是正确的吗?

能告诉我为什么在循环后出现死锁吗?

最佳答案

channel block 上方的范围,因为 channel 未在 sq 中关闭。

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 的堆栈。堆栈转储通常会指出问题所在。

关于go - for循环导致死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42148500/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com