Запуск Pybind11 в одном потоке

Возможно ли, чтобы pybind11 запускал интерпретатор Python в одном потоке в С++? У меня есть класс, который

  1. инициализирует интерпретатор и
  2. вызывает функцию в скрипте Python.

Я хотел бы вызвать эту функцию для нескольких потоков, которые создает С++.

#include "pybind11/pybind11.h" 
#include <iostream>
#include <thread>

namespace py = pybind11;

class callMyPythonFunctionFromCpp
{
    callMyPythonFunctionFromCpp() { m_module = py::module::import("mypython_script_file"); }

    void myfunc() // trying to call this function on multiple threads.
    { 
        py::object res = m_module.attr("myfunc");
    }

private:
    py::scoped_interpreter m_guard;
    py::module m_module;

};

void thread_function()
{
    callMyPythonFunctionFromCpp m;
    m.myfunc();
    std::cout << "thread function\n";
}

int main()
{
    std::thread t(&thread_function);
    // ...

    return 0;
}

person AFPP    schedule 11.02.2020    source источник
comment
Сильно зависит от того, что делает mypython_script_file. Некоторые ресурсы (файлы, сигналы, глобальные переменные C) остаются общими, как и в любой другой многопоточной программе, но при таком подходе теряются любые средства управления доступом, поскольку модуль Python не знает, что он был многопоточным. Некоторые из этих проблем можно обойти, выполнив начальный импорт в основную программу, что позволит завершить инициализацию C до запуска каких-либо потоков.   -  person Wim Lavrijsen    schedule 12.02.2020
comment
Привет, Вим, могу я поделиться своим мнением об этом посте, пожалуйста? stackoverflow.com/q/60609340/1227860. Искренне ценю это,   -  person AFPP    schedule 10.03.2020