在pickle 模块文档中有一段示例代码:
reader = pickle.load(open('save.p', 'rb'))
在第一次读取时,它看起来会分配一个系统文件描述符,读取其内容,然后“泄漏”打开的描述符,因为没有任何句柄可供调用close()
。这让我想知道是否有任何隐藏的魔法可以解决这个问题。
深入研究源代码,我在 Modules/_fileio.c 中发现文件描述符被 fileio_dealloc() 析构函数关闭,这导致了真正的问题。
上面示例代码使用的文件对象的持续时间是多少?在该语句执行之后,该对象是否确实变得未被引用,因此 fd 是否会close(2)
在未来的垃圾收集清理中受到真正的调用?如果是这样,示例行是一种好的做法,还是不应该指望释放 fd 从而冒内核每个进程描述符表耗尽的风险?