是嵌入式python Py_Finalize()阻塞?

时间:2014-07-16 11:33:08

标签: python c++

当我运行大型嵌入式python程序时,我看到间歇性崩溃。我的问题是Py_Finalize()调用块,直到所有的python解释器在继续之前处于安全状态?如果没有,我如何知道解释器何时销毁了所有内容?

我目前的代码如下:

Py_Initialize();
...
...
Py_Finalize(); // Unsure if this returns immediately or returns after completing all Finalizing actions

2 个答案:

答案 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解释器并执行任务(我对此方法更为熟悉),您将不会遇到很多麻烦。