首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >pygtk垃圾收集运行时创建的函数是否连接到信号?

pygtk垃圾收集运行时创建的函数是否连接到信号?
EN

Stack Overflow用户
提问于 2014-10-31 21:46:33
回答 1查看 111关注 0票数 0

我在用PyGtk。

当小部件被销毁时,连接到小部件的信号“runtime-generated”的garbage-collected函数会是吗?

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-03 17:12:03

简单地说,是的,动态创建的函数就像运行时创建的任何其他Python对象一样。

更长的答案:对于垃圾收集器管理的资源,例如没有绑定到外部资源的对象,Python和PyGTK将正确地释放未使用的对象。对于外部资源(如打开的文件或正在运行的线程),您需要采取步骤确保它们的正确清理。要准确地回答你的问题,看看具体的代码是有用的。一般来说,以下内容适用于Python和GTK:

  • Python对象,包括动态创建的函数,在无法再从Python获得它们之后,会被解除分配。在某些情况下,取消分配是在对象变得不可访问之后立即发生的(如果对象不涉及引用周期),而在另一些情况下,您必须等待垃圾收集器启动。
  • 销毁一个小部件会使与小部件关联的GTK资源立即被清除。对象本身可以保持活着。通过小部件可以访问的回调应该立即取消引用,并且,如果没有其他任何从Python保存它们的东西,则应该很快将其解除分配。

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

代码语言:javascript
运行
复制
>>> 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以包含循环引用,例如修改它以提及自身:

代码语言:javascript
运行
复制
def handler():
    handler      # closure with circular reference

...the调用销毁将不再导致gone立即打印-这将要求程序继续工作,或一个明确的调用gc.collect()。在大多数Python程序中,自动去分配“只起作用”,您不需要做任何努力来帮助它。

最终,唯一可靠的测试(是否存在内存泄漏)是在无限循环中运行可疑代码,并监视进程的内存消耗--如果它无限制地增长,一些东西不会被释放,您就会出现内存泄漏。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26683870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档