栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

依靠__del __()在Python中进行清理是否不可靠?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

依靠__del __()在Python中进行清理是否不可靠?

您会观察到垃圾回收语言中的终结器的典型问题。Java拥有它,C#拥有它,并且它们都提供了基于范围的清理方法,例如Python

with
关键字来处理它。

主要问题是,垃圾收集器负责清理和销毁对象。在C
++中,对象超出范围时将被销毁,因此您可以使用RAII并具有明确定义的语义。在Python中,只要GC喜欢,对象就会超出范围并继续存在。根据您的Python实现,这可能有所不同。CPython及其基于引用计数的GC相当不错(因此您很少看到问题),而PyPy,IronPython和Jython可能会使对象存活很长时间。

例如:

def bad_pre(filename):    return open(filename, 'r').read()for i in xrange(10000):    bad_pre('some_file.txt')

bad_pre
泄漏文件句柄。在CPython中没关系。引用计数降至零,并立即删除。在PyPy或IronPython中,由于耗尽所有可用的文件描述符(
ulimit
在Unix或Windows上最多为509句柄),您可能会遇到IOError或类似问题。

使用上下文管理器进行基于范围的清理,

with
如果您需要保证清理,则它是首选。您确切地知道何时完成对象。但是有时您无法轻松实施这种范围的清理。那是当你可能会使用
__del__
atexit
或类似的结构做在清理尽力而为。它不可靠,但总比没有好。

您可以给用户增加显式清理负担,也可以强制执行显式作用域,或者您可以随便赌博,

__del__
然后时不时地看到一些奇怪的地方(尤其是解释器关闭)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/659704.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号