[英]Too many open files in python
我写了一种测试套件,它占用大量文件。 一段时间(2h)之后,我收到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
因此,如果我运行以下测试:
print get_open_fds()
for i in range(0,100):
f = open("/tmp/test_%i" % i, "w")
f.write("test")
print get_open_fds()
我得到以下输出:
[]
/tmp/test_0
[3]
/tmp/test_1
[4]
/tmp/test_2
[3]
/tmp/test_3
[4]
/tmp/test_4
[3]
/tmp/test_5
[4] ...
真奇怪,我期望打开的文件描述符会越来越多。 我的脚本正确吗?
我正在使用python的记录器和子进程。 那可能是我FD泄漏的原因吗?
谢谢,丹尼尔
正确的代码是:
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)
你的测试脚本将覆盖f
每次迭代中,这意味着该文件将每次获得封闭。 记录到文件和带有管道的subprocess
使用了描述符,这可能导致耗尽。
resource.RLIMIT_NOFILE确实为7,但这是对resource.getrlimit()的索引,而不是限制本身的索引... resource.getrlimit(resource.RLIMIT_NOFILE)是您想要的顶级range()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.