是内嵌python Py_Finalize()阻塞
Is embedded python Py_Finalize() blocking?
当我运行大型嵌入式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解释器并执行任务(我更熟悉这种方法),则不会遇到太多麻烦。
- QTcpSocket在不阻塞GUI的情况下重新连接到服务器
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- 为什么创建服务器后C++ httplib 库阻塞了我的主线程?
- 阻塞信号会导致升压过程不起作用
- 避免在条件更新时丢失唤醒是一个阻塞功能
- pthread_kill() 与 pthread_cancel() 终止因 I/O 而阻塞的线程
- 提升 asio io_content运行非阻塞
- 阻塞管道连接命名管道不触发
- 在C++中执行非阻塞线程
- 如果 I/O read() 处于阻塞阶段,如何使用 Ctrl+C 退出 C++ 程序?
- C++17 标准::异步非阻塞执行
- 如何实现阻塞处理循环?
- 不安全的 MPI 非阻塞通信示例?
- 内联asm编译器屏障(内存阻塞器)是算作外部函数,还是算作静态函数调用
- cors 阻塞请求的根源在哪里?
- 用于免等待生产者和阻塞使用者的环形缓冲区
- 被阻塞的互斥量有多贵
- 正在等待在非阻塞文件描述符上长时间运行ioctl
- C++如何判断互斥体在阻塞其他线程时是否被单个线程不成比例地占用
- boost asio计时器是否会在"取消"时阻塞