我只是在读取/proc/diskstats文件。我的代码是:
func ReadFromFile(filepath string)(string){
defer func() {
if err1 := recover(); err1 != nil {
fmt.Println("!!!!!!!!!!!!!!!!Panic Occured and Recovered in readFromFile(), Error Info: ", err1)
}
}()
strData := ""
data, err := ioutil.ReadFile(filepath)
if err != nil{
fmt.Println("File read error: ", err)
return ""
}
strData = string(data)
return strData
}我得到的错误是:
File read error: open /proc/diskstats: too many open files不仅对于这个文件,我也在其他一些文件中得到了相同的错误。
我还运行了这个命令:
root@golang:~# lsof|wc -l
785请给我引路。
发布于 2017-08-04 15:47:37
我遇到了同样的问题(可能是不同的环境或设置),并以不同的方式修复了它:
func some_func(file_name []string) {
for _, file_name := range file_names {
f, _ := os.Create(file_name)
// defer f.Close() // bad idea
_, _ = f.Write([]byte("some text"))
f.Close() // better idea
}
}问题是,当函数返回时,defer将被执行,这可能需要一段时间-取决于循环的大小(坏主意)。所以只需要明确地做(更好的想法)
发布于 2016-06-14 16:08:23
基本上,在UNIX平台中,操作系统对进程在任何给定时间可能具有的打开文件描述符的数量进行了限制。
由于您已达到当前打开的文件(和或管道或套接字)的限制,并且您正在尝试打开新文件(和或管道或套接字),因此会引发错误too many open files。
要避免此问题,必须在完成使用Close()函数打开的文件时关闭该文件
发布于 2019-11-16 07:00:49
OP不提供Minimal, Reproducible Example。有问题的错误是由未发布的代码引起的。演示这一点的一种简单方法是在一个最小的示例中运行所提供的代码(没有其他活动),并确保它不会失败。
当然,函数ioutil.ReadFile会关闭该文件。在这种情况下,它之所以受到牵连,只是因为它试图在已经达到资源限制时打开一个新文件。
Go中一个常见的陷阱是无法关闭隐式打开的流。这种情况的一个具体情况是,在使用http库的客户端函数时打开一个流。
完成后,客户端必须关闭响应正文:
resp, err := http.Get("http://example.com/")
if err != nil {
// handle error
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)这样的请求应该始终包括使用如上所示的表单调用 Close,。
可能还有其他类似的隐式流被打开的情况...
这是一个特别棘手的问题,因为对于琐碎的程序,您永远不会知道其中的区别。你不会知道有问题,直到你运行了数百次,甚至数千次迭代。然后,错误通常可能表现为一些不相关的函数调用失败--就像OP所演示的那样。
https://stackoverflow.com/questions/37804804
复制相似问题