去ioutil.ReadFile()中的错误

时间:2012-02-07 06:28:20

标签: go

我在Go中运行一个程序,它在读取文件/proc/stat后不断发送数据。 使用ioutil.ReadFile("/proc/stat") 跑了大约14个小时后我犯了错误:too many files open /proc/stat 点击here获取代码段。

我怀疑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))
    }
}

2 个答案:

答案 0 :(得分:5)

原因可能是程序中的某个地方:

  • 您忘记关闭文件,或

  • 你依靠垃圾收集器在对象终结时自动关闭文件,但是Go的保守垃圾收集器没有这样做。在这种情况下,您应该检查程序的内存消耗(在程序运行时是否稳定增加)。

在任何一种情况下,尝试检查/proc/PID/fd的内容,以查看程序运行时打开文件的数量是否在增加。

答案 1 :(得分:0)

如果您确定要执行f.Close(),它仍然存在问题,可能是因为您的其他连接(例如与MYSQL的连接)也会导致问题,尤其是在循环中,而你忘了关闭连接。

总是这样做:

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

If it is in loop

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

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