Как вызвать многопоточный код Python из C ++?

Я пытаюсь взаимодействовать с устаревшим многопоточным приложением Python из какого-то нового кода на C ++, который разрабатывается. Кажется, я не могу заставить вызовы C ++ к Python работать надежно, если код Python запустил поток. В псевдокоде я пытаюсь заставить работать:

  • Бинарный C ++ начинает работать
  • Бинарный код C ++ инициализирует среду Python и импортирует необходимые ему модули
  • Python запускает один или несколько потоков
  • На каком-то этапе позже C ++ делает один или несколько вызовов функций Python
  • C ++ программа очищает среду Python & выходы.

Код, который я до сих пор успешно вызывал функцию Python несколько раз из C ++, успешно, но аварийно завершает работу при выходе, а также единственный поток, созданный в Python, кажется, останавливается до того момента, когда программа C ++ завершает работу.

Текущие вызовы, которые я делаю для настройки среды Python:

  // Initialize Python environment
Py_Initialize();

// Initialize threading and acquire Python GIL
PyEval_InitThreads();

PyThreadState * mainThreadState = NULL;
// save a pointer to the main PyThreadState object
mainThreadState = PyThreadState_Get();
// release the lock
PyEval_ReleaseLock();

// get the global lock
PyEval_AcquireLock();
// get a reference to the PyInterpreterState
PyInterpreterState* mainInterpreterState = mainThreadState->interp;
// create a thread state object for this thread
PyThreadState* myThreadState = PyThreadState_New(mainInterpreterState);
// free the lock
PyEval_ReleaseLock();

PySys_SetArgv(argc, argv);

Затем функция Python вызывается несколько раз так:

  // grab the global interpreter lock
PyEval_AcquireLock();
// swap in my thread state
PyThreadState_Swap(myThreadState);

PyObject* pMod = PyImport_ImportModule(moduleName.c_str());
PyObject* pfn = PyObject_GetAttrString(pMod, fnName.c_str());

// Create the data structure to pass the single C string
PyObject* pargs = Py_BuildValue("(s)", arg.c_str());
PyObject* result = PyEval_CallObject(pfn, pargs);

Py_DECREF(pargs);
Py_DECREF(pfn);
Py_DECREF(pMod);

// clear the thread state
PyThreadState_Swap(NULL);
// release our hold on the global interpreter
PyEval_ReleaseLock();

Единовременный код очистки, вызываемый при выходе из приложения C ++:

  PyEval_AcquireLock();
Py_Finalize();

Было бы замечательно, если бы кто-то мог указать мне на некоторый пример кода, который делает то, что я пытаюсь достичь, или мог указать на то, что я делаю неправильно на вышеуказанных шагах?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]