- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用以下程序:
from traits.api import HasTraits, Int, Instance
from traitsui.api import View
class NewView(View):
def __del__(self):
print('deleting NewView')
class A(HasTraits):
new_view = Instance(NewView)
def __del__(self):
print('deleting {}'.format(self))
a = Int
def default_traits_view(self):
new_view = NewView('a')
return new_view
a = A()
del(a)
deleting <__main__.A object at 0x12a016a70>
a = A()
a.configure_traits()
del(a)
deleting <__main__.A object at 0x12a016650>
最佳答案
这里发生的事情是NewView
object 参与一个引用循环,并且该循环中的对象不会作为 CPython 的主要基于引用计数的对象释放机制的一部分自动收集。然而,它们最终应该作为 CPython 循环垃圾收集器的一部分被收集,或者您可以通过执行 gc.collect()
来强制收集。 ,所以这里应该没有实际的长期内存泄漏。
具有讽刺意味的是,试图通过添加 __del__
来检测最终的集合。方法 NewView
阻碍进程,因为它呈现 NewView
对象不可收集:至少在 Python 2 中,Python 不会尝试收集包含具有 __del__
的对象的循环。方法。见 gc
docs详情。 (由于 PEP 442 中概述的更改,Python 3 在这里更聪明一些。)所以对于 __del__
方法,使用Python 2,确实会随着时间的推移出现缓慢的内存泄漏。解决方法是删除__del__
方法。
这是一个显示引用循环的图(实际上,这显示了包含 NewView
对象的对象图的整个强连接组件):节点是所涉及的对象,箭头从引用者指向被引用者。在图表的右下部分,您会看到 NewView
对象具有对其顶级 Group
的引用(通过 content
属性),以及 Group
对象具有对原始 View 的引用(container
属性)。在 View 的其他地方也有类似的循环。
可能值得在 Traits UI 跟踪器上打开功能请求:理论上,当不再需要 View 时,应该可以手动中断引用循环,尽管在实践中可能需要对 Traits UI 源进行大量修改。
下面的代码演示了(删除了 __del__
方法)对 gc.collect
的调用确实收集了 NewView
对象:它存储对 A
上的 View 的弱引用例如,带有一个回调,该回调报告该 View 何时被垃圾收集。
from traits.api import HasTraits, Int, Instance
from traitsui.api import View
import gc
import weakref
class NewView(View):
pass
def report_collection(ref):
print("NewView object has been collected")
class A(HasTraits):
a = Int
def default_traits_view(self):
new_view = NewView('a')
self.view_ref = weakref.ref(new_view, report_collection)
return new_view
def open_view():
a = A()
a.configure_traits()
print("Collecting cyclic garbage")
gc.collect()
print("Cyclic garbage collection complete")
open_view
时看到的叫做:
>>> open_view()
Collecting cyclic garbage
NewView object has been collected
Cyclic garbage collection complete
关于enthought - 如何使用 View 避免内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40840033/
我正在使用 Enthought Traits/UI 系统,并希望在 Float 特征上强制执行最小值,该特征出现在 GUI 中并且可由用户编辑。 最佳答案 使用 Range特质代替。 Range(lo
我使用的是 openSUSE 12.3 64 位。 Canopy 发布时我成功安装了它,从那以后我通过删除 ~/Enthgout 和 ~/Canopy 来卸载它。 现在我尝试再次安装 Canopy,安
在库中是这样导入的特征: from enthought.traits.api import Int, Float # and the other bad thing: from enthought.t
我最近发现了 Enaml,这是一个来自 Enthought 的 Python GUI 开发包。我非常有兴趣将它与 Enthought Traits 和 Chaco 一起使用,以实现更快速的科学应用开发
我正在使用带有 PanTool 和 ZoomTool 的 chaco 散点图。通过平移和缩放与绘图交互后,我想要一个按钮将绘图重置为默认状态,基本上类似于 matplotlib 主页按钮。我搜索了文档
我正在使用 venv 从 PyPI 安装比根环境中可用的更新版本的 elpy 包。从 pip 查询,我看到 elpy 的以下版本: ~/python/standalone $ pip show elp
使用以下程序: from traits.api import HasTraits, Int, Instance from traitsui.api import View class NewView(
感谢 SO 上的另一位用户 (Warren Weckesser),我找到了一种格式化 TabularAdapter 列的好方法。我还想完成一些其他自定义,所以我想我应该将其发布给 SO,看看是否可以获
我已经在 Windows 7 上安装了 Enthought Canopy Express 1.03,最近更新到版本 1.1.0.1371,还根据帖子 Best way to install OpenC
我一直在尝试运行以下Python代码(来自Enthought的网站)来测试Enthought的Mayavi模块的动画功能。 from mayavi import mlab import numpy n
def print_square(i): print str(i*i) from multiprocessing import Pool p = Pool(1) for i in range(
如果我在 python 或 ipython 中使用箭头键,我不会得到我应该得到的,而是得到一个奇怪的字符组合:一切都像 this 中那样。线程,除了我从未从源代码编译过 python。 发生的事情大致
我正在处理一些代码,这些代码使用 Traits UI 来显示一个对话框,用户可以从中选择两个文件: class Files(HasTraits): filename_1 = File(exis
考虑这个简单的最小示例: from traits.api import Instance, Str, HasTraits class Person(HasTraits): name = Str
我在 Mac OS X PyCharm 上将 Enthought 设置为解释器: ~/Library/Enthought/Canopy_64bit/User 但是,它不显示来自 matplotlib
我使用的是32位Windows 7系统,我刚刚安装了Canopy Enthought Python(1.0.1)但是我无法正确运行它,因为我收到如下消息: “内核(用户 Python 环境)已终止,错
我之前使用 Qt 控制台使用 EPD Python 发行版,其中最有用的功能之一是在同时进行多项计算时轻松地在多个选项卡中拥有多个内核。 我最近得到了“新的”Enthought Canopy,它以某种
我在Canopy里面使用的是matplotlib库,具体函数是xkcd()。此函数使用特定字体来绘制图表。字体为 Comic Sans MS,如果不存在,应下载。 /home/luis/Enthoug
我有一个 HPlotContainer,默认有 2 个空 LinePlots,使用 create_line_plot() 工厂函数创建。然后我执行一些计算并想更新绘图。如何访问 LinePlot 的
我正在尝试使用 Python(2.7)、flask、apache2、mod_wsgi 和 Enthought Canopy 虚拟环境(使用 Canopy 附带的 canopy_cli 命令行界面创建)
我是一名优秀的程序员,十分优秀!