猿问

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

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

    }

}


鸿蒙传说
浏览 168回答 1
1回答

SMILET

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

相关分类

Go
我要回答