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

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

嵌入式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程序员认为他们的库一次加载,而在进程退出时卸载。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5664332.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存