2012-02-07 34 views
4

我正在Go中运行程序,该程序在读取文件/proc/stat后连续发送数据。 使用ioutil.ReadFile("/proc/stat") 运行了大约14小时后,我得到了err:too many files open /proc/stat 点击here获取代码片段。在ioutil.ReadFile()中发现错误

我怀疑推迟f.Close被Go忽略,或者它正在跳过它。


的代码片段(如果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

之前,不要把db.connection [编程的第一条规则:它总是你的错(http://www.codinghorror.com/blog /2008/03/the-first-rule-of-programming-its-always-your-fault.html) – 2012-02-07 06:30:09

+1

stackoverflow的第一条规则:张贴错误的代码,而不是一些后期制作,并不能肯定地重现问题。 – thwd 2012-02-07 17:34:18

+0

我很好奇,你有没有发现它是什么? – 2013-03-20 15:10:00

回答

4

的原因可能就是在你的程序的地方:

  • 你忘记关闭文件,或者

  • 你靠在垃圾收集器在对象完成时自动关闭文件,但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 

循环