我在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))
}
}
答案 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放在循环之前