查找python对象的隐藏位置



我有一个问题,其中有一个python对象隐藏在某个地方。该对象是C库的包装器,我需要在退出时调用释放例程,否则(幕后)线程将挂起(它是一个python对象,因此释放放在__dealloc__方法中)。

问题是我无论如何也找不出这个物体藏在哪里。我没有故意引入任何全局状态。有没有办法知道物体在哪里停留?它可能只是一个停留的对象周期,所以gc应该把它捡起来?尽管如此,如果可能的话,我还是很想找出问题的原因。

编辑:我解决了这个问题,这是由于pyglet事件处理程序没有被干净地删除。它们在__del__方法中,但是对象没有被删除,因为事件调度程序持有对象方法。这在逻辑上很好,但对我来说,对象从未被删除,即使在退出时也是如此,这似乎很奇怪。有人知道为什么在解释器退出时不调用__del__吗?事实上,这个问题已经被问过了——尽管答案并不出色。

无论如何,基本的问题仍然存在——我如何可靠地找到这些挥之不去的引用?

一个可能的位置是gc.garbage,它是一个被发现无法访问的对象列表,但不能被删除,因为它们在一个循环中包含__del__方法。

在3.4之前的Python中,如果你有一个包含几个__del__方法的循环,解释器不知道它们应该以哪种方式执行,因为它们可能有相互引用。因此,它不执行任何操作,而是将对象移动到该列表中。

如果您在那里找到您的对象,文档建议执行del gc.garbage[:]

首先避免这种情况的解决方案是在可能的情况下使用weakrefs来避免循环。

相关内容

  • 没有找到相关文章

最新更新