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) 返回空列表,因为 TrueFalse 它们本身就是内置的,不会被跟踪。

>>> get_all(bool)
[]

不过,不难看出如何使用此功能来查找泄漏类型的所有实例,并使用 gc.get_referrers()gc.get_referents()

get_all() 进行了优化,因此获取用户创建的类型的实例非常快。设置 include_subtypesFalse 将在不需要子类型实例的情况下进一步提高性能。

备注

无法保证由返回的对象的状态 get_all() ,特别是在并发环境中。例如,一个对象可能正在执行其 __init__() 并且只被部分建造。

boltons.gcutils.toggle_gc = <boltons.gcutils.GCToggler object>

用于禁用代码块的GC的上下文管理器。看见 GCToggler 了解更多详细信息。

boltons.gcutils.toggle_gc_postcollect = <boltons.gcutils.GCToggler object>

上下文管理器,用于禁用代码块的GC,并在重新启用之前进行收集。看见 GCToggler 了解更多详细信息。