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.

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

报告相同问题?

悬赏问题

  • ¥15 Python语言实验
  • ¥15 SAP HANA SQL 增加合计行
  • ¥20 用C#语言解决一个英文打字练习器,有偿
  • ¥15 srs-sip外部服务 webrtc支持H265格式
  • ¥15 在使用abaqus软件中,继承到assembly里的surfaces怎么使用python批量调动
  • ¥15 大一C语言期末考试,求帮助🙏🙏
  • ¥15 ch340驱动未分配COM
  • ¥15 Converting circular structure to JSON
  • ¥30 Hyper-v虚拟机相关问题,求解答。
  • ¥15 TSM320F2808PZA芯片 Bootloader