查找python对象隐藏的位置

时间:2014-05-13 09:58:16

标签: python cython

我遇到一个问题,其中有一个隐藏在某个地方的python对象。该对象是一个C库的包装器,我需要在退出时调用deallocation例程,否则(幕后)线程将挂起(它是一个cython对象,所以解除分配放在__dealloc__方法中)

问题是我不能为我的生活解决对象隐藏的问题。我没有故意介绍任何全球国家。有没有办法解决对象挥之不去的问题?它可能只是一个挥之不去的物体周期,所以gc应该捡起来吗?也就是说,如果可能的话,我真的想解决问题的原因。

编辑:我解决了这个问题,这个问题归结为没有被彻底删除的pyglet事件处理程序。它们位于__del__方法中,但该对象未被删除,因为事件调度程序持有了一个对象方法。这在逻辑上很好,但对我来说,即使在退出时对象永远不会删除,这似乎很奇怪。有谁知道为什么在翻译出口没有调用__del__?实际上,这个问题有been asked - 虽然答案并不精彩。

无论如何,基本问题仍然存在 - 我如何可靠地找到这些挥之不去的参考文献?

1 个答案:

答案 0 :(得分:0)

一个可能的地方是gc.garbage这是一个已找不到的对象列表,但由于它们在一个循环中包含__del__个方法,因此无法删除。

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

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

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