是内嵌python Py_Finalize()阻塞

Is embedded python Py_Finalize() blocking?

本文关键字:Finalize 阻塞 Py python      更新时间:2023-10-16

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

我当前的代码是这样的:

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

我不认为这完全回答了我最初问的问题,但是,我已经找到了一种方法,使垃圾收集器在我们调用Py_Finalize时做得更好。即停止在Python中使用静态类变量。

旧代码:

class MyClass(object):
    a = {}
    def __init__(self):
        ...
    ...
新代码:

class MyClass(object):
    def __init__(self):
        self.a = {}
        ...
...

如果我正确调用Py_Finalize();将清除python解释器(在[1]上发现一些异常)。

我建议你为python解释器创建一个类,并在调用Py_Finalize();之前手动检查所有任务是否完成。在我使用嵌入式python解释器的项目中,这是最适合的。

希望有帮助!

(Python文档)[1]https://docs.python.org/2/c-api/init.html

== EDIT ==

为Py_Finalize ()

错误和警告:模块和模块中的对象的销毁是无次序地做的;这可能导致析构函数(del()方法)当它们依赖于其他对象(甚至函数)或模块时失败。由Python加载的动态加载扩展模块则不是卸载。由Python解释器分配的少量内存可能无法释放(如果发现泄漏,请报告)。记忆挂钩对象之间的循环引用不被释放。一些内存由扩展模块分配的内存不能被释放。一些扩展可能如果它们的初始化例程被多次调用,则无法正常工作一次;如果应用程序调用Py_Initialize和,就会发生这种情况Py_Finalize .

似乎如果你的程序只调用Py_Initialize()和Py_Finalize()一次,你可能会发现一些问题(我从来没有),并有一些内存泄漏。但是,如果您只是在主程序运行时初始化python解释器并执行任务(我更熟悉这种方法),则不会遇到太多麻烦。