如果fd超出本地范围,Python会关闭它吗?

2024-05-08 22:09:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我发现Python自动关闭我的文件描述符。运行以下代码并使用lsof查找打开的文件。当sleep-in函数openAndSleep时,我发现进程保存了文件“fff”。但当函数用完时,文件“fff”就不再保存了。在

import time

def openAndSleep():
    f = open("fff", 'w')
    print "opened, sleep 10 sec"
    time.sleep(10)
    print "sleep finish"

openAndSleep()
print "in main...."
time.sleep(10000)

我检查了class文件,它没有del\方法。很奇怪,有人知道吗?在


Tags: 文件函数代码inimportffftime进程
2条回答

简而言之:是的。在

Python通过实现垃圾收集机制,使用户无需管理内存。 这基本上意味着如果没有人使用Python中的每个对象都将被自动释放和删除,以释放内存和资源,以便以后在程序中再次使用它们。在

文件对象是Python对象,与Python中的任何其他对象一样,它们也由垃圾回收器管理。一旦您离开函数作用域,垃圾回收器就会发现没有人使用该文件(使用引用计数器)并处理该对象—这意味着也会关闭该对象。在

要避免这种情况,可以使用os.open打开文件,而不使用Python文件对象,它返回文件描述符(int),而不是Python文件对象。文件描述符不会被垃圾回收器丢弃,因为它不是Python对象,而是一个操作系统对象,因此您的代码可以工作。 但是,您应该小心地稍后关闭(os.close)fd,否则您将泄漏资源,您的程序迟早会崩溃(一个进程只能存储1024个文件描述符,然后无法打开更多的文件)!在

附加信息:

{a1}

是的,CPython会的。在

当文件对象的引用计数降至0时,它们将自动关闭。正在清理的本地作用域意味着refcount将下降,如果本地作用域是唯一的引用,则文件对象refcount将下降到0并关闭。在

但是,最好将file对象用作with语句中的上下文管理器,并以这种方式自动关闭它;不要指望CPython的特定垃圾处理实现:

def openAndSleep():
    with open("fff", 'w') as f:
        print "opened, sleep 10 sec"
        time.sleep(10)
        print "sleep finish"

注意,__del__是定制Python类的钩子;file对象是用C实现的,并填充^{} slot^{} function关闭file对象。在

如果要使文件对象保持打开状态更长时间,请确保仍有对它的引用。也可以在其他地方存储对它的引用。从函数中返回它并存储返回值,例如,将其设为全局变量,等等

相关问题 更多 >

    热门问题