Использование субинтерпретаторов с отдельным GIL в CPython 3.12
В версии 3.12 CPython появилась новая фича
PEP 684: A Per-Interpreter GIL ("sub-interpreters may now be created with a unique GIL per interpreter. This allows Python programs to take full advantage of multiple CPU cores").
Но как ей пользоваться?
Следующая наивная попытка задействовать новый функционал гарантированно падает в менеджере памяти при большом количестве потоков (Win10, MSC):
#include <python.h>
#include <thread>
#include <array>
static void foo(void)
{
static constexpr PyInterpreterConfig config =
{ .use_main_obmalloc = 0,
.check_multi_interp_extensions = 1,
.gil = PyInterpreterConfig_OWN_GIL, // !!!!!!!!!
};
PyThreadState *interpreter{};
Py_NewInterpreterFromConfig(&interpreter, &config);
PyRun_SimpleString("print('Hello, World!')");
Py_EndInterpreter(interpreter);
}
int main()
{
Py_InitializeEx(1);
for (auto &&t : std::array<std::jthread, 32>{})
t = std::jthread{ foo };
Py_FinalizeEx();
}
Как правильно использовать новые возможности CPython для параллельной работы нескольких интерпретаторов в одном процессе? Есть ли где официальные examples?