在C/C++程序中从多个操作系统线程调用多个独立的嵌入式Python解释器
在 C/C++ 应用程序中嵌入 Python 解释器 的方法已经有很多文档介绍了。现在的问题是,如何在多个操作系统线程上运行多个 Python 解释器(也就是说,在同一个进程中,每个线程一个解释器),这些线程是从 C/C++ 应用程序中调用的?这样的应用程序可能还会遇到内存碎片和 Py_Finalize() 的一些限制。
一种可能的方法如下:
- 在 pyconfig.h 中禁用 Python 线程和全局解释器锁(GIL),这样可以简化操作(#undef WITH_THREAD)
- 将 Python 解释器源代码中所有可变的全局变量移动到堆分配的结构体中,并通过线程局部存储(Thread Local Storage,简称 TLS)进行引用(参考: Python on a Phone)。
我有几个问题:
- 有没有更好的方法?
- 有没有工具可以自动将 Python 解释器源代码中的全局变量转换为通过 TLS 引用的堆分配结构体?
类似的话题可以在这里讨论:
1 个回答
5
这不是直接回答你问题的内容,但你可以考虑使用独立的进程,而不是线程,这样问题就应该解决了。
优点:
- 不需要对Python进行复杂的修改(而且还要确保修改后的结果在所有情况下都能正常工作)
- 整体开发工作量可能会更少
- 升级到新的Python版本会更简单
- 不同进程之间的接口非常清晰,这样更容易理解和调试
缺点:
- 根据你的平台,可能会稍微占用更多资源(在Linux上,进程相对比较轻量)
如果你使用共享内存进行进程间通信,那么你的应用代码和使用线程时的代码应该差不多。
考虑到有些人认为你应该始终选择使用进程而不是线程,我建议如果符合你的需求,可以把它作为一个替代方案考虑一下。