我在一个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的算法不是我的工作,我不应该改变它
这是基于粗略的python知识,并快速阅读python文档.
PyThreadState_SetAsyncExc 允许您将一个异常注入正在运行的python线程中.
在某个线程中运行python解释器.在另一个线程中,PyGILState_STATE然后PyThreadState_SetAsyncExc进入主线程.(这可能需要一些前期工作来教授python解释器关于第二个线程).
除非你运行的python代码充满了"catch alls",否则这应该会导致它终止执行.
您还可以查看代码以创建python子解释器,这将允许您在旧脚本关闭时启动新脚本.
Py_AddPendingCall 也很有诱惑力,但周围有足够的警告可能没有.
| 归档时间: |
|
| 查看次数: |
1618 次 |
| 最近记录: |