我是新手。当我注释掉第二个goroutine时,出现致命错误。我不知道是什么原因导致此错误发生。你能跟我解释一下吗?

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int)
    go func() {
        for i := 0; i < 10; i++ {
            ch <- i
        }
    } ()
    // go func() {
        for {
            if num, ok := <-ch; !ok {
                break
            } else {
                fmt.Printf("%d\n", num)
            }
        }
    // } ()
    time.Sleep(2 * time.Second)
    close(ch)
}

这将输出以下代码:
0
1
2
3
4
5
6
7
8
9
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:
main.main()
    /tmp/sandbox169127128/main.go:17 +0xa0

Program exited.

最佳答案

从发送goroutine接收到所有值后,在从ch接收时,receive for循环块将被接收。运行时检测到程序被卡住并出现紧急情况。

解决方法是在发送所有值后关闭 channel :

go func() {
    for i := 0; i < 10; i++ {
        ch <- i
    }
    close(ch)
} ()

在封闭 channel 上接收会产生值0, false。接收for循环会中断false值。

从程序末尾删除close(ch)

Run it on the playground

关于go - goroutine之间的死锁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43297474/

10-13 08:45