Использование субинтерпретаторов с отдельным 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?


Ответы (0 шт):