for循环导致死锁

古吉拉特邦桑塔纳(Gujarat Santana):

我已经从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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章