Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pygtk垃圾收集运行时创建的连接到信号的函数吗?_Python_Drag And Drop_Garbage Collection_Gtk_Pygtk - Fatal编程技术网

Python pygtk垃圾收集运行时创建的连接到信号的函数吗?

Python pygtk垃圾收集运行时创建的连接到信号的函数吗?,python,drag-and-drop,garbage-collection,gtk,pygtk,Python,Drag And Drop,Garbage Collection,Gtk,Pygtk,我在用PyGtk 当小部件被销毁时,连接到小部件的信号drag_data_get的运行时生成的函数是否会被垃圾收集 关于创建并与拖动源/目标关联的Gtk.TargetList的相同问题 我确实找到了,但没有太大帮助。简言之:是的,有,动态创建的函数与运行时创建的任何其他Python对象一样创建 更详细的回答:对于垃圾收集器管理的资源,例如未绑定到外部资源的对象,Python和PyGTK将正确地处理未使用的对象。对于外部资源,如打开的文件或正在运行的线程,您需要采取步骤确保其正确清理。为了准确地回

我在用PyGtk

当小部件被销毁时,连接到小部件的信号drag_data_get的运行时生成的函数是否会被垃圾收集

关于创建并与拖动源/目标关联的Gtk.TargetList的相同问题


我确实找到了,但没有太大帮助。

简言之:是的,有,动态创建的函数与运行时创建的任何其他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程序中,自动释放只起作用,您无需费劲


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

非常感谢您给出了这一彻底的答案。我更关心的是拖放部分。由于涉及到一些用户交互,无限循环不容易测试。你的回答让我暂时相信PyGtk,因为这些对象可以运行,所以TargetList应该由垃圾收集器管理。谢谢。@BastienJacquet没问题-另一种测试方法是将一个大对象附加到函数,或者使用答案中显示的report_death函数监视它。