Pygtk是否对连接到信号的运行时创建的函数进行垃圾回收?

2024-03-28 22:11:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我在用PyGtk。你知道吗

运行时生成的函数连接到小部件的“drag\u data\u get”信号,当小部件被销毁时,它是否会被垃圾收集?你知道吗

同样的问题Gtk.目标列表是否创建并与拖动源/目标关联?你知道吗

我确实找到了Python and GTK+: How to create garbage collector friendly objects?,但没有太大帮助。你知道吗


Tags: andto函数目标gtk列表dataget
1条回答
网友
1楼 · 发布于 2024-03-28 22:11:48

简而言之:是的,动态创建的函数就像在运行时创建的任何其他Python对象一样创建。你知道吗

更详细的回答:对于由垃圾收集器管理的资源,例如没有绑定到外部资源的对象,Python和PyGTK将正确地处理未使用的对象。对于外部资源,如打开的文件或正在运行的线程,您需要采取步骤确保正确清理它们。为了准确地回答您的问题,查看具体的代码将非常有用。通常,以下内容适用于Python和GTK:

  • Python对象,包括动态创建的函数,在Python无法再访问它们之后,会被释放。在某些情况下,解除分配会在对象变得不可访问之后立即发生(如果对象不涉及引用循环),而在其他情况下,则必须等待垃圾收集器启动。

  • 销毁小部件会导致立即清除与小部件关联的GTK资源。物体本身可以保持活着。可以通过小部件访问的回调应该立即取消引用,如果Python中没有其他东西可以保留它们,那么很快就会取消分配。

您可以使用weakref模块中的弱引用类型来测试这一点。例如:

>>> import gtk
>>> 
>>> def report_death(obj):
...     # arrange for the death of OBJ to be announced
...     def announce(wr):
...         print 'gone'
...     import weakref
...     report_death.wr = weakref.ref(obj, announce)
... 
>>> def make_dynamic_handler():
...     def handler():
...         pass
...     # for debugging - we want to know when the handler is freed
...     report_death(handler)
...     return handler
... 
>>> w = gtk.Window()
>>> w.connect('realize', make_dynamic_handler())
10L
>>> w.destroy()
gone

现在,如果您将代码更改为handler以包含循环引用,例如通过修改它来提及它自己:

def handler():
    handler      # closure with circular reference

…对destroy的调用将不再导致gone立即打印-这将要求程序继续工作,或显式调用gc.collect()。在大多数Python和PyGTK程序中,自动释放“只起作用”,您不需要努力帮助它。你知道吗

最终,唯一可靠的测试是否存在内存泄漏的方法是在无限循环中运行可疑代码,并监视进程的内存消耗—如果它无限制地增长,则某些内容不会被释放,并且存在内存泄漏。你知道吗

相关问题 更多 >