我有以下内容: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())
}
}
最佳答案
有一个奇怪的竞争条件。基本上,当您调用 Println
时,一些 goroutine 仍在运行,但很快就会终止。在 Println
之前休眠,您将获得 1 个进程
。如果您阅读日志,您将看到 2 个超时 - 这意味着您跳过了循环中的 2 个 channel 读取。它以某种方式让您的主 goroutine 有时间从 channel 读取 8 个值并在 2 个 goroutine 终止之前调用 Println
。这是一个竞争条件,所以很难准确描述发生了什么。除了您的代码之外,调度程序和 channel 实现在这里也很重要。
关于go - 为什么我会发生内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35677713/