Go语言中ioutil.ReadFile()出现了bug

4
我正在运行一个Go程序,它在读取文件/proc/stat后不断发送数据。使用ioutil.ReadFile("/proc/stat")函数。大约运行了14个小时之后,出现了错误:too many files open /proc/stat。点击这里查看代码片段。
我怀疑有时候Go会忽略f.Close(),或者跳过它。
代码片段(以防play.golang.org比stackoverflow.com更早崩溃):
package main

import ("fmt";"io/ioutil")

func main() {
    for {
        fmt.Println("Hello, playground")
        fData,err := ioutil.ReadFile("/proc/stat")
        if err != nil {
            fmt.Println("Err is ",err)
        }   
        fmt.Println("FileData",string(fData))
    }
}

3
编程的第一条规则:问题总是在你身上。 - Brian Roach
1
StackOverflow的第一条规则:发布有问题的代码,而不是一些无法确定问题复现的产物。 - thwd
我很好奇,你最终找出来它是什么了吗? - Matt Joiner
抱歉如果我错了,但是因为只有ReadFile(),所以有关闭文件的方法吗? - fallais
2个回答

5
可能的原因是在程序中的某处:
- 您忘记关闭文件,或者 - 您依赖于垃圾收集器在对象终结时自动关闭文件,但Go的保守垃圾收集器未能做到这一点。 在这种情况下,您应该检查程序的内存消耗(在程序运行时是否持续增加)。
请尝试检查/proc/PID/fd的内容,以查看程序运行时打开文件的数量是否在增加。

0
如果您确定已经执行了f.Close(),但仍然存在问题,可能是因为您的其他连接(例如到MYSQL的连接)也会导致问题,特别是在循环中,并且您忘记关闭连接。
始终执行以下操作:
db.connection....
**defer db.Close()**

If it is in loop

loop
    db.connection....
    **defer db.Close()**
end

不要在循环之前放置db.connection


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接