栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

嵌入式Python 3解释器是否会泄漏内存?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

嵌入式Python 3解释器是否会泄漏内存?

您可以看到该错误(第一个错误,始于2007年)由nnorwitz关闭为“ wontfix”,并且其帖子位于错误报告中。

为什么您

Py_Initialize/Py_Finalize
不止一次打电话?为什么不做这样的事情(为了方便起见,我有点混用C和Python):

Py_Initialize();while (moreFiles()) {    PyRun_SimpleString("execfile('%s')" % nextFile());    }Py_Finalize();

问题在于,大多数编写Python模块的人都不必担心如果模块被完成并重新初始化会发生什么,并且通常不关心在完成过程中进行清理。模块作者知道,当进程退出时,所有内存都将释放,因此,别无所求。

因此,这实际上不是一个错误,而是一千个错误-每个扩展模块一个。对于影响少数用户的错误,这是大量的工作,其中大多数用户都有可行的解决方法。

您始终可以只忽略对的呼叫

Py_Finalize
Py_Initialize
第二次呼叫是禁止操作。这意味着您的应用程序在首次运行Python脚本时将使用额外的内存,并且直到您退出后,额外的内存才会返回给操作系统。只要您仍然不时地运行Python脚本,我就不会将其归类为泄漏。您的应用程序可能不是Valgrind干净的,但是比像筛子那样泄漏更好。

如果您需要卸载(纯)Python模块以避免泄漏内存,则可以这样做。只需将它们从中删除即可

sys.modules

缺点

Py_Finalize
如果要重复执行Python脚本,则
Py_Finalize
在它们之间运行没有太大意义。每次重新初始化时,都必须重新加载所有模块。我的Python在启动时会加载28个模块。

补充说明:
该错误不仅限于Python。如果尝试卸载和重新加载库,则任何语言的大量库代码都会泄漏内存。许多库都调用C代码,许多C程序员认为他们的库一次加载,而在进程退出时卸载。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/662372.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号