在 Python C API 中使用所有 CPU 个核心

Using all CPU cores in Python C API

是否有可能在最新的 Python 的 C API 中以任何方式使用所有 CPU 个内核?

因为 GIL Python 一次只能使用一个 CPU 核心,因此在多核机器上性能较低。

但是 C API 在一个 C++ 程序中有多个解释器的可能性没有很好的记录。

是否有可能通过合并多个解释器,甚至每个 C++ 线程一个解释器,在每个 thread/interpreter 中具有单独的 GIL,从而允许 运行 每个 C++ 线程使用单独的核心因此使用全部 100% CPU 性能?

据说in docs that there is only one single GIL within one program, if I understand correctly, so different interpreters created by Py_NewInterpreter()共享同一个GIL,不能全部有单独的GIL。这意味着如果我获得 GIL,那么所有其他解释器都将被阻止。也许我错误地解释了文档...

任务是这样的,在我要执行的每个单独线程中的 C++ 程序中 PyRun_String(...),所有线程都不会共享任何东西。如果有帮助,每个这样的 PyRun_String() 都可以在单独的解释器中 运行。

因为所有 C++ 线程不共享任何东西(因此不共享 PyObject * 实例)也许根本不获取 GIL 是可能的?不知道Python C API的全局状态(全局变量)是否需要GIL保护?也许只有 PyObject * 实例需要保护,因此如果 C++ 线程不共享 PyObject * 那么可能不需要获取 GIL,有人知道吗?

因为我知道可以在这个 C++ 程序中生成多个进程 运行。但现在我想了解任务(使用所有 100% CPU 核心)是否可以在一个 C++ 进程中解决。

我也在想通过下一个解决方案可能是可能的:Python C API 是 link 通过 python39.lib 编辑的,它有一些全局 C 变量,这些全局变量保存 C 解释器的状态。也许有可能以某种方式 link 库以所有全局变量进入某个可重定位区域的方式,以便稍后在每个 C++ 线程中我用全局变量创建单独的内存区域。因此,每个线程都将拥有其全局变量的副本,从而导致每个线程中的解释器状态完全分离。但是我不知道有什么方法可以使全局变量可以为单个给定的 .lib 文件重定位,你知道有什么方法可以做到这一点吗?

Is it possible in latest Python's C API to anyhow use all CPU cores?

不,不容易。我假设一个 Linux 系统(根据您的 OS 调整我的回答)。

您可以编写一些代码 extension in C using Pthreads or in C++ something using C++ threads, or run several Python processes (e.g. communicating with unix(7) sockets or fifo(7)...)

请注意 Python 实现是 open-source software。您可以研究并改进它以实现您的目标。

目前,cpython 为所有解释器使用一个共享的 GIL。 运行 python代码时需要持有GIL来保护内部结构。因此,python 代码无法并发执行,即使在单独的解释器中也是如此。

Python 3.10 将对此不完全支持 ([subinterpreters] Meta issue: per-interpreter GIL),但需要在构建时使用 --experimental-isolated-subinterpreters.

启用它