从C/C++程序调用多个操作系统线程上的多个独立嵌入式Python解释器

bha*_*dra 22 python thread-local python-embedding

C/C++应用程序中嵌入Python解释器已有详细记录.在C/C++应用程序中调用的多个操作系统线程(即同一进程中的一个操作系统线程上的一个解释器)上运行多个python解释器的最佳方法是什么?此类应用程序也可能存在与内存碎片和Py_Finalize()限制相关的问题.

一种这样的方法可以是:

  1. Python线程,因此在pyconfig.h中禁用GIL以保持简单(#undef WITH_THREAD)
  2. Python解释器源代码的所有可变全局变量都移动到通过线程本地存储引用的堆分配结构(参考:电话上的Python).

我的问题是:

  1. 有没有更好的方法?
  2. 是否有任何工具可以自动将Python解释器源代码的全局变量转换为通过TLS(线程本地存储)引用的堆分配结构?

这里讨论类似的主题:

Chr*_*ger 5

这并不完全是您问题的答案,但您可以使用单独的进程而不是线程,那么问题就会消失。

优点:

  • 无需破解 python(并确保结果在所有预期情况下都有效)
  • 整体开发工作量可能较少
  • 轻松升级到新的 python 版本
  • 不同进程之间清晰定义的接口,因此更容易正确使用和调试

缺点:

如果您对 IPC 使用共享内存,则生成的应用程序代码不应与使用线程获得的代码有太大差异。

鉴于有些人认为您应该始终使用进程而不是线程,如果它以任何方式符合您的限制,我至少会考虑将其作为替代方案。