Python3解释器在嵌入时会泄漏内存吗?

2024-10-01 07:29:11 发布

您现在位置:Python中文网/ 问答频道 /正文

This bug report声明,Python解释器(2007年6月)不会在用嵌入的Python解释器调用C/C++应用程序中调用pythFielt时清除所有分配的内存。建议在应用程序终止时调用Py_Finalize一次。在

This bug report声明从版本3.3到2011年3月,解释器仍然泄漏内存。在

有人知道这个问题的现状吗?我之所以担心,是因为我有一个应用程序,在这个应用程序中,每个运行的实例都会多次调用解释器,而且我遇到了内存泄漏问题。在

我已经在使用boost::python来处理引用计数,并且在运行期间运行python程序创建的所有引用都会被清除掉。我有一些独生子女的课程-这些可能是问题吗?在

这是一个容易处理的问题还是Python解释器中的一个bug?在


Tags: 实例内存pyreport版本应用程序声明this
1条回答
网友
1楼 · 发布于 2024-10-01 07:29:11

您可以看到,这个bug(第一个bug,来自2007年)被nnorwitz关闭为“wontfix”,他的帖子在bug报告中。在

^{bq}$

问题是,大多数编写Python模块的人并不担心如果他们的模块最终完成并重新初始化会发生什么,而且通常不关心在完成过程中的清理工作。模块作者知道,当进程退出时,所有的内存都会被释放,除此之外,不必再费心了。在

所以这不是一个bug,而是1000个bug,每个扩展模块一个。对于一个影响到少数用户的bug来说,这是一个巨大的工作量,大多数用户都有可行的解决方法。在

您总是可以忽略对Py_Finalize的调用,第二次调用Py_Initialize是不可操作的。这意味着当您第一次运行Python脚本时,应用程序将使用额外的内存,并且在退出之前,这些额外的内存不会返回到操作系统。只要您仍然每隔一段时间运行Python脚本,我就不会将其归类为泄漏。你的应用程序可能不太干净,但总比像筛子一样漏掉要好。在

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

如果重复执行Python脚本,那么在它们之间运行Py_Finalize是没有意义的。每次重新初始化时都必须重新加载所有模块;我的Python在引导时加载28个模块。在

附加说明:这个bug不仅限于Python。如果您尝试卸载和重新加载库,任何语言的库代码都会泄漏内存。许多库调用C代码,许多C程序员假设他们的库只加载一次,当进程退出时就被卸载。在

相关问题 更多 >