我有以下内容:http : //play.golang.org/p/1aaive8KQx当我打印 runtime.NumGoroutine() 时,我得到 3。我不应该只得到 1 吗?为什么?package mainimport ( "log" "runtime" "time")func main() { for i := 1; i <= 10; i++ { ch := make(chan int, 10) timeout := time.Tick(1 * time.Second) for i := 1; i <= 10; i++ { go func(i int) { time.Sleep(2 * time.Second) ch <- i }(i) } for i := 1; i <= 10; i++ { select { case j := <-ch: log.Println(j) case <-timeout: log.Println("timeout") } } log.Println("Processes", runtime.NumGoroutine()) }}
1 回答

SMILET
TA贡献1796条经验 获得超4个赞
有一个奇怪的竞争条件。基本上发生的事情是当你调用Println
一些 goroutines 仍在运行但很快就会终止。先睡一觉Println
,你就会得到1 Processes
。如果您阅读日志,您将看到 2 个超时 - 这意味着您在循环中跳过了 2 个通道读取。不知何故,它让您的主协程有时间从通道读取 8 个值并Println
在 2 个协程终止之前调用。这是一种竞争条件,因此很难准确描述发生了什么。除了您的代码之外,调度程序和通道的实现在这里也很重要。
- 1 回答
- 0 关注
- 167 浏览
添加回答
举报
0/150
提交
取消