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

Posted

技术标签:

【中文标题】从 C/C++ 程序调用的多个操作系统线程上的多个独立嵌入式 Python 解释器【英文标题】:Multiple independent embedded Python Interpreters on multiple operating system threads invoked from C/C++ program 【发布时间】:2011-02-27 10:33:45 【问题描述】:

在C/C++ application is well documented 中嵌入 Python 解释器。在从 C/C++ 应用程序调用的多个操作系统线程(即同一进程中的一个操作系统线程上的一个解释器)上运行多个 python 解释器的最佳方法是什么?此类应用程序还可能存在与内存碎片和limitations of Py_Finalize()相关的问题。

一种这样的方法可以是:

    Python 线程和因此 GIL 在 pyconfig.h 中被禁用以保持简单 (#undef WITH_THREAD) Python 解释器源代码的所有可变全局变量都移至通过线程本地存储引用的堆分配结构(参考:Python on a Phone)。

我的问题是:

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

此处讨论了类似的主题:

Multiple independent Python interpreters in a C/C++ program? Multiple python interpreters within the same process Lua Versus Python

【问题讨论】:

最佳解决方案是多个嵌入式 python 解释器的问题集非常小。在沿着这条路线花费太多精力之前,我会非常确定多进程、消息传递的解决方案是不切实际的。 当您说“操作系统”时,您可能是指“进程”?如果是这样,shell 的& 几乎可以满足您的所有需求。操作系统通常在进程级别工作。如果您的意思是“过程”,请更正您的问题。如果您真的认为您的意思是“线程”,请说明您为什么认为操作系统线程如此重要。 【参考方案1】:

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

优点:

无需破解 python(并确保结果适用于所有预期情况) 总体上可能会减少开发工作 轻松升级到新的 Python 版本 明确定义不同进程之间的接口,从而更容易正确和调试

缺点:

可能会稍微超重,具体取决于您的平台 (relatively light-weight processes on linux)

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

鉴于有些人认为您应该始终use processes over threads,如果它以任何方式符合您的限制,我至少会考虑将其作为替代方案。

【讨论】:

以上是关于从 C/C++ 程序调用的多个操作系统线程上的多个独立嵌入式 Python 解释器的主要内容,如果未能解决你的问题,请参考以下文章

c/c++ 多线程 多个线程等待同一个线程的一次性事件

一个线程执行多个进程

从多个线程调用 boost::asio::io_service 运行函数

如何在 C# 中调用多个控件

线程是如何在 Windows 上的多个处理器上执行的?

从多个线程使用 stdlib 的 rand()