go - 为什么我会发生内存泄漏?

标签 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())
    }
}

最佳答案

有一个奇怪的竞争条件。基本上,当您调用 Println 时,一些 goroutine 仍在运行,但很快就会终止。在 Println 之前休眠,您将获得 1 个进程。如果您阅读日志,您将看到 2 个超时 - 这意味着您跳过了循环中的 2 个 channel 读取。它以某种方式让您的主 goroutine 有时间从 channel 读取 8 个值并在 2 个 goroutine 终止之前调用 Println。这是一个竞争条件,所以很难准确描述发生了什么。除了您的代码之外,调度程序和 channel 实现在这里也很重要。

关于go - 为什么我会发生内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35677713/

相关文章:

go - Go 中执行的函数片段的错误处理

Golang 将多个文件添加到 http 多部分请求

go - 使用 Golang Mux Router 和 http.FileServer 预期的根文件和自定义 404

time - 解析不是 'standard' 格式的日期/时间字符串

go - 如何初始化特定的结构格式

testing - 使用包调用 go test 时的输出差异

http - 配置 http :localhost for Golang

http - http.ResponseWriter在主体中返回回车符

debugging - 如何可视化堆转储?

go - 在Go中多次洗牌