Sockets ipython笔记本和泄漏的文件描述符

Sockets ipython笔记本和泄漏的文件描述符,sockets,ipython-notebook,file-descriptor,resource-leak,Sockets,Ipython Notebook,File Descriptor,Resource Leak,我在ipython笔记本上运行的代码中有文件描述符泄漏的问题。我正在用urllib2下载很多文件并将它们保存在本地。显然,urllib2有泄漏文件描述符的历史记录,我怀疑这是造成问题的原因。最后,我得到了一个错误:打开的文件太多 作为一种解决方法,我定期使用os.close关闭一组套接字。不幸的是,ipython笔记本上有很多我不想关闭的插槽 是否有一种方法可以识别哪些文件描述符/套接字等。。属于伊皮顿吗 这并不是一个真正的答案,但有几个变通方法,以防其他人发现自己在这里遇到泄漏的文件描述符问题

我在ipython笔记本上运行的代码中有文件描述符泄漏的问题。我正在用urllib2下载很多文件并将它们保存在本地。显然,urllib2有泄漏文件描述符的历史记录,我怀疑这是造成问题的原因。最后,我得到了一个错误:打开的文件太多

作为一种解决方法,我定期使用os.close关闭一组套接字。不幸的是,ipython笔记本上有很多我不想关闭的插槽


是否有一种方法可以识别哪些文件描述符/套接字等。。属于伊皮顿吗

这并不是一个真正的答案,但有几个变通方法,以防其他人发现自己在这里遇到泄漏的文件描述符问题

第一种可能更好的解决方法是使用subprocess.call下载我想要的wget文件。它的速度大约是下面方法的4倍

第二种解决方法是使用我在上面找到的一些方便的函数,而这些函数我目前找不到-如果您找到了,请编辑此函数或让我知道,我将链接:

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
有了这些,在开始下载文件之前,我存储了活动文件描述符和相应的名称。然后,我定期测试打开的文件描述符的数量,如果它变得非常大,使用os.close对所有不在原始列表中的文件描述符进行检查—描述符本身也会被回收

它很难看,有时ipython笔记本会抱怨一些事情,比如不能保存历史——大概我已经击碎了它正在使用的东西,但它在其他方面工作得很好