duanbing8817 2016-02-28 01:39
浏览 9
已采纳

为什么会出现内存泄漏?

I have the following: http://play.golang.org/p/1aaive8KQx

When I print the runtime.NumGoroutine() I get 3. Shouldn't I be getting just 1? Why?

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条回答 默认 最新

  • dongzhong7443 2016-02-28 02:34
    关注

    There is a weird race condition. Basically what happens is when you call Println some goroutines are still running but will terminate shortly. Put a sleep before Println and you will get 1 Processes. If you read the log you will see 2 timeouts - it means you skipped 2 channel reads in the loop. Somehow it gives your main goroutine time to read 8 values from the channel and call Println before 2 goroutines are terminated. It's a race condition so it's hard to describe exactly what's going on. Apart from your code the scheduler and channels implementation also play major here.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?