ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python的垃圾回收能否在所有情况下都保证回收循环引用的对象?

2019-12-01 09:56:01  阅读:460  来源: 互联网

标签:circular-reference python garbage-collection


这个问题是我先前提出的问题的扩展:Python Delegate Pattern – How to avoid circular reference?阅读答复后,我决定澄清我的问题,但要求将其单独发布.

开始:

> Python文档中的一段(如下所示)指出,不能保证对循环进行垃圾回收
引用的对象.我发现here的帖子暗示了同样的事情.但是,对我之前的问题的答复不同意.所以,我误会了这段话还是在那边
我错过的细节?
>我想使用弱引用,如Alex Martelli在对问题Should I worry about circular references in Python?的答复中所述,将完全避免在他的答复中提到的垃圾收集循环引用对象的开销吗?如果是这样,它如何运作?

有关Python的文档,建议在从Python的文档中通过后出现冲突:

CPython implementation detail: CPython currently uses a
reference-counting scheme with (optional) delayed detection of
cyclically linked garbage, which collects most objects as soon as they
become unreachable, but is not guaranteed to collect garbage
containing circular references
. See the documentation of the gc module
for information on controlling the collection of cyclic garbage. Other
implementations act differently and CPython may change. Do not depend
on immediate finalization of objects when they become unreachable (ex:
always close files).

该段落的原始形式可以在这里找到:http://docs.python.org/reference/datamodel.html我的是大胆的设置.

预先感谢您的任何答复.

解决方法:

我认为,不能保证具有循环引用的对象不能被收集的最重要原因是,根据设计,Python绝不会在定义__del__方法的情况下收集具有循环引用的对象.有一个漂亮的straightforward reason

Python doesn’t collect such cycles automatically because, in general, it isn’t possible for Python to guess a safe order in which to run the __del__() methods.

我不愿意说这是可能无法检测到带有循环引用的不可达对象的唯一原因.可能有几种异常情况可能会破坏GC的循环检测机制.但是除非您为其中一个对象定义__del__,否则您可能会好的.只是不必担心,如果发现性能问题,请使用GC的广泛调试选项.

标签:circular-reference,python,garbage-collection
来源: https://codeday.me/bug/20191201/2079900.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有