dmo*_*ock 23 python file-descriptor
我写了一种严重的文件密集型测试套件.过了一段时间(2小时)我得到了一个IOError: [Errno 24] Too many open files: '/tmp/tmpxsqYPm'
.我仔细检查了所有文件句柄是否再次关闭它们.但错误仍然存在.
我试图弄清楚使用的允许文件描述符resource.RLIMIT_NOFILE
的数量和当前打开的文件解析器的数量:
def get_open_fds():
fds = []
for fd in range(3,resource.RLIMIT_NOFILE):
try:
flags = fcntl.fcntl(fd, fcntl.F_GETFD)
except IOError:
continue
fds.append(fd)
return fds
Run Code Online (Sandbox Code Playgroud)
所以,如果我运行以下测试:
print get_open_fds()
for i in range(0,100):
f = open("/tmp/test_%i" % i, "w")
f.write("test")
print get_open_fds()
Run Code Online (Sandbox Code Playgroud)
我得到这个输出:
[]
/tmp/test_0
[3]
/tmp/test_1
[4]
/tmp/test_2
[3]
/tmp/test_3
[4]
/tmp/test_4
[3]
/tmp/test_5
[4] ...
Run Code Online (Sandbox Code Playgroud)
这很奇怪,我预计会有越来越多的打开文件描述符.我的剧本是否正确?
我正在使用python的logger和subprocess.这可能是我的fd泄漏的原因吗?
谢谢,丹尼尔
dan*_*ast 14
更正的代码是:
import resource
import fcntl
import os
def get_open_fds():
fds = []
soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE)
for fd in range(0, soft):
try:
flags = fcntl.fcntl(fd, fcntl.F_GETFD)
except IOError:
continue
fds.append(fd)
return fds
def get_file_names_from_file_number(fds):
names = []
for fd in fds:
names.append(os.readlink('/proc/self/fd/%d' % fd))
return names
fds = get_open_fds()
print get_file_names_from_file_number(fds)
Run Code Online (Sandbox Code Playgroud)
小智 10
resource.RLIMIT_NOFILE确实是7,但这是resource.getrlimit()的索引,而不是限制本身... resource.getrlimit(resource.RLIMIT_NOFILE)是你想要你的顶级范围()