gcutils
-垃圾收集工具¶
Python垃圾收集器 (GC) 通常不会得到太多关注,可能是因为:
Python 的 reference counting 有效地处理绝大多数未使用的对象
人们正在慢慢地学习避免实现 object.__del__()
该系列本身在简约和强大之间取得了很好的平衡 (tunable generation sizes )
收集器本身速度很快,很少会导致其他运行时中与GC相关的长时间暂停
即便如此,对于许多应用程序来说,开发人员需要追踪的时刻将会到来:
循环引用
行为不端的物体(锁、
__del__()
)内存泄漏
或者仅仅是减少百分之几的执行时间的方法
多亏了 gc
模块,GC正是这些任务的一个经过良好检测的入口点, gcutils
旨在进一步促进这一进程。
- class boltons.gcutils.GCToggler(postcollect=False)[源代码]¶
这个
GCToggler
是一个上下文管理器,它允许用户安全地更好地控制垃圾收集计划。坊间经验表明,某些对象创建繁重的任务只需在最后执行一次显式收集,就可以获得约10%的加速,特别是如果大多数对象将保持不变的话。两个GCToggler已经出现在
gcutils
模块:toggle_gc
只需在上下文入口关闭GC,并在退出时重新启用toggle_gc_postcollect
执行相同的操作,但会在重新启用后触发显式收集。
>>> with toggle_gc: ... x = [object() for i in range(1000)]
在这两个实例之间,
GCToggler
类型可能不会直接使用,但出于继承的目的而进行了记录。
- boltons.gcutils.get_all(type_obj, include_subtypes=True)[源代码]¶
获取包含给定类型的所有实例的列表。这将适用于绝大多数类型的人。
>>> class Ratking(object): pass >>> wiki, hak, sport = Ratking(), Ratking(), Ratking() >>> len(get_all(Ratking)) 3
然而,也有一些例外。例如,
get_all(bool)
返回空列表,因为True
和False
它们本身就是内置的,不会被跟踪。>>> get_all(bool) []
不过,不难看出如何使用此功能来查找泄漏类型的所有实例,并使用
gc.get_referrers()
和gc.get_referents()
。get_all()
进行了优化,因此获取用户创建的类型的实例非常快。设置 include_subtypes 至False
将在不需要子类型实例的情况下进一步提高性能。备注
无法保证由返回的对象的状态
get_all()
,特别是在并发环境中。例如,一个对象可能正在执行其__init__()
并且只被部分建造。