停止嵌入式python

Joã*_*ira 4 c++ python embed

我在一个C++插件中嵌入了python.插件在每个会话期间调用python算法几十次,每次都向算法发送不同的数据.到现在为止还挺好

但是现在我遇到了一个问题:该算法有时需要几分钟才能解决并返回一个解决方案,在此期间,通常条件会发生变化,使得该解决方案无关紧要.所以,我想要的是随时停止算法的运行,并在使用其他数据集之后立即运行它.

这是我到目前为止嵌入python的C++代码:

void py_embed (void*data){


counter_thread=false;

PyObject *pName, *pModule, *pDict, *pFunc;

//To inform the interpreter about paths to Python run-time libraries
Py_SetProgramName(arg->argv[0]);

if(!gil_init){
    gil_init=1;
    PyEval_InitThreads();
    PyEval_SaveThread();
}
PyGILState_STATE gstate = PyGILState_Ensure();

// Build the name object
pName = PyString_FromString(arg->argv[1]);
if( !pName ){
    textfile3<<"Can't build the object "<<endl;
}

// Load the module object
pModule = PyImport_Import(pName);
if( !pModule ){
    textfile3<<"Can't import the module "<<endl;
}

// pDict is a borrowed reference 
pDict = PyModule_GetDict(pModule);
if( !pDict ){
    textfile3<<"Can't get the dict"<<endl;
}

// pFunc is also a borrowed reference 
pFunc = PyDict_GetItemString(pDict, arg->argv[2]);
if( !pFunc || !PyCallable_Check(pFunc) ){
    textfile3<<"Can't get the function"<<endl;
}

/*Call the algorithm and treat the data that is returned from it
 ...
 ...
 */

// Clean up
Py_XDECREF(pArgs2);
Py_XDECREF(pValue2);
Py_DECREF(pModule);
Py_DECREF(pName);

PyGILState_Release(gstate);

counter_thread=true;
_endthread(); 
Run Code Online (Sandbox Code Playgroud)

};

编辑:python的算法不是我的工作,我不应该改变它

Yak*_*ont 5

这是基于粗略的python知识,并快速阅读python文档.

PyThreadState_SetAsyncExc 允许您将一个异常注入正在运行的python线程中.

在某个线程中运行python解释器.在另一个线程中,PyGILState_STATE然后PyThreadState_SetAsyncExc进入主线程.(这可能需要一些前期工作来教授python解释器关于第二个线程).

除非你运行的python代码充满了"catch alls",否则这应该会导致它终止执行.

您还可以查看代码以创建python子解释器,这将允许您在旧脚本关闭时启动新脚本.

Py_AddPendingCall 也很有诱惑力,但周围有足够的警告可能没有.