如何从C ++调用多线程Python代码?

时间:2017-04-20 17:43:54

标签: python c++ multithreading python-2.7 gil

我正在尝试从正在开发的一些新C ++代码与传统的多线程Python应用程序进行交互。如果Python代码启动了一个线程,我似乎无法使C ++到Python调用可靠地工作。在伪代码中,我想要的是:

  • C ++二进制文件开始运行
  • C ++二进制文件初始化Python环境并导入所需的模块
  • Python启动一个或多个线程
  • 在某个阶段之后,C ++会对Python函数进行一次或多次调用
  • ...
  • C ++程序清理Python环境&退出。

到目前为止,我已经成功地从C ++成功地多次调用Python函数,但在退出时崩溃,并且在Python中创建的单个线程似乎一直停滞,直到C ++程序退出之前。

我正在设置Python环境的当前调用是:

rowsconfigures

然后像这样多次调用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);

C ++应用程序即将退出时调用的一次性清理代码是:

  // 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();

如果有人能指出一些我想要实现的示例代码,或者可以指出我在上述步骤中做错了什么,那会很棒吗?

0 个答案:

没有答案