为什么我会出现内存泄漏?

时间:2016-02-28 01:39:01

标签: go

我有以下内容: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())
    }
}

1 个答案:

答案 0 :(得分:1)

有一种奇怪的竞争条件。基本上会发生什么,当你打电话给Println时,一些goroutine仍在运行,但很快就会终止。在Println之前睡一觉,你会得到1 Processes。如果您阅读日志,您将看到2个超时 - 这意味着您在循环中跳过2个通道读取。不知何故,它给你的主要goroutine时间从频道读取8个值并在2个goroutine终止之前调用Println。这是一场竞争条件,因此很难准确描述正在发生的事情。除了您的代码,调度程序和通道实现在这里也很重要。

相关问题