我有以下内容:http://play.golang.org/p/1aaive8KQx
当我打印runtime.NumGoroutine()时,我得到3.我不应该只得到1吗?为什么呢?
package main
import (
"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())
}
}
答案 0 :(得分:1)
有一种奇怪的竞争条件。基本上会发生什么,当你打电话给Println
时,一些goroutine仍在运行,但很快就会终止。在Println
之前睡一觉,你会得到1 Processes
。如果您阅读日志,您将看到2个超时 - 这意味着您在循环中跳过2个通道读取。不知何故,它给你的主要goroutine时间从频道读取8个值并在2个goroutine终止之前调用Println
。这是一场竞争条件,因此很难准确描述正在发生的事情。除了您的代码,调度程序和通道实现在这里也很重要。