Возможно ли, чтобы pybind11 запускал интерпретатор Python в одном потоке в С++? У меня есть класс, который
- инициализирует интерпретатор и
- вызывает функцию в скрипте 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;
}
mypython_script_file
. Некоторые ресурсы (файлы, сигналы, глобальные переменные C) остаются общими, как и в любой другой многопоточной программе, но при таком подходе теряются любые средства управления доступом, поскольку модуль Python не знает, что он был многопоточным. Некоторые из этих проблем можно обойти, выполнив начальный импорт в основную программу, что позволит завершить инициализацию C до запуска каких-либо потоков. - person Wim Lavrijsen   schedule 12.02.2020