当通道未关闭时,为什么没有死锁?

时间:2019-03-15 08:27:01

标签: go

Go RunTime写入管道,然后不关闭管道,然后正常执行。

为什么不关闭通道时没有死锁?

package main

import (
    `fmt`
    `time`
)

func product(num int) chan int {
    ch := make(chan int, 1)

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

    return ch
}

func main() {
    in := product(100)

    go func() {
        for v := range in {
            fmt.Println(v)
        }
    }()

    time.Sleep(time.Second)
}

// 0 1 2 3 4 5 ...

1 个答案:

答案 0 :(得分:2)

因为在任何情况下,两个goroutine都不会互相等待,而它们中的任何一个都可以继续执行。

您在单独的(非主要)goroutine中从通道中读取内容,与此同时,主要goroutine未被阻塞,并且在计时器达到1秒后退出。

如果将read for循环移至主goroutine,则会出现死锁错误。因为在这种情况下,由于您尝试读取的通道未关闭并且没有人再写入该程序,因此该程序将永远被阻塞。

另请参阅Deadlock between goroutines