当我运行大型嵌入式python程序时,我看到间歇性崩溃。我的问题是Py_Finalize()调用块,直到所有的python解释器在继续之前处于安全状态?如果没有,我如何知道解释器何时销毁了所有内容?
我目前的代码如下:
Py_Initialize();
...
...
Py_Finalize(); // Unsure if this returns immediately or returns after completing all Finalizing actions
答案 0 :(得分:1)
我不认为这完全回答了我最初提出的问题,但是,当我打电话给Py_Finalize
时,我找到了让垃圾收集器做得更好的方法。那就是停止在Python中使用静态类变量。
旧代码:
class MyClass(object):
a = {}
def __init__(self):
...
...
新代码:
class MyClass(object):
def __init__(self):
self.a = {}
...
...
答案 1 :(得分:0)
如果我正确调用Py_Finalize();
将清除python解释器(在[1]上找到一些例外)。
我建议您为python解释器创建一个类,并在调用Py_Finalize();
之前手动检查所有任务是否已完成。在我使用嵌入式python解释器工作的项目中,这是最适合的。
希望它有所帮助!
[Python Doc] [1] https://docs.python.org/2/c-api/init.html
==编辑==
对于Py_Finalize()
错误和警告:模块中模块和对象的破坏是 以随机顺序完成;这可能会导致析构函数( del ()方法) 当它们依赖于其他对象(甚至函数)或模块时失败。 由Python加载的动态加载的扩展模块不是 卸载。 Python解释器分配的少量内存 可能没有被释放(如果发现泄漏,请报告)。内存并列 不释放对象之间的循环引用。一些记忆 由扩展模块分配的可能不会被释放。一些扩展可能 如果他们的初始化例程被调用超过,则无法正常工作 一旦;如果应用程序调用Py_Initialize和,则会发生这种情况 Py_Finalize不止一次。
好像你的程序只调用Py_Initialize()和Py_Finalize()一次,你可能会发现一些麻烦(我从未这样做过)并且有一些内存泄漏。但是,如果您只是在主程序运行时初始化python解释器并执行任务(我对此方法更为熟悉),您将不会遇到很多麻烦。