【发布时间】:2018-07-17 23:19:15
【问题描述】:
我如何阻止 main func 并允许 goroutines 通过通道进行通信以下代码示例会引发错误
0 致命错误:所有 goroutine 都处于休眠状态 - 死锁!
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan int)
go func() {
value := <-ch
fmt.Print(value) // This never prints!
}()
go func() {
for i := 0; i < 100; i++ {
time.Sleep(100 * time.Millisecond)
ch <- i
}
}()
c := make(chan int)
<-c
}
【问题讨论】:
-
你在哪里运行这个?如果
GOMAXPROCS大于1,则打印0,然后死锁。 -
在我的情况下它什么也不打印,只是抛出那个错误
-
当然可以打印。您自己显示输出:
0fatal error ...。行首的0来自打印语句。 -
哇 .. 实际上,您对此的反应非常重要。我的代码确实有效。问题是我的结局并不好,所以当所有 goroutines 都睡觉时......它会死锁。
-
如果由于 main 没有做任何事情而死锁,则将 goroutine 移至 main 中的 for 循环,这意味着您应该在 main 函数中执行您的例程之一,