【发布时间】:2018-02-02 21:39:03
【问题描述】:
package main
import (
"fmt"
"time"
)
func main() {
p := producer()
for c := range p {
fmt.Println(c)
}
}
func producer() <-chan string {
ch := make(chan string)
go func() {
for i := 0; i < 5; i++ {
ch <- fmt.Sprint("hello", i)
time.Sleep(1 * time.Second)
}
// commented the below to show the issue
// close(ch)
}()
return ch
}
运行上述代码将打印 5 条消息,然后给出“所有 goroutines are a sleep - deadlock error”。我知道如果我关闭频道,错误就会消失。
我想了解的是,运行时如何知道代码将在通道上无限等待,并且没有其他东西会将数据发送到通道中。
现在,如果我向 main() 函数添加一个额外的 go 例程.. 它不会抛出任何错误并继续在通道上等待。
go func() {
for {
time.Sleep(2 * time.Millisecond)
}
}()
这是否意味着.. go 运行时只是在寻找一个正在运行的 go 例程,该例程可能会将数据发送到通道中,因此不会引发死锁错误?
【问题讨论】:
标签: go