鲜花网站建设的总体目标,saas自助建站,wordpress 文章字数,有什么网站可以做免费推广C调用Python脚本进行18次循环操作后#xff0c;脚本不执行
现象#xff1a;
发送端接收端
从第二张图中可以看出#xff0c;python脚本卡在’[parkin_debug] 6’与’[parkin_debug] 7’之间 该测试经过多次反复测试#xff0c;均在第18次循环执行时#xff0c;出现上述问…C调用Python脚本进行18次循环操作后脚本不执行
现象
发送端接收端
从第二张图中可以看出python脚本卡在’[parkin_debug] 6’与’[parkin_debug] 7’之间 该测试经过多次反复测试均在第18次循环执行时出现上述问题
解决办法
在python解释器初始化位置加入以下多线程支持
PyEval_InitThreads(); //开启多线程支持
int nInit PyEval_ThreadsInitialized(); //检测线程支持是否开启成功
if (nInit){PyEval_SaveThread(); //因为调用PyEval_InitThreads成功后当前线程就拥有了GIL释放当前线程的GIL。
}在调用python脚本前加入以下代码
int nHold PyGILState_Check() ; //检测当前线程是否拥有GIL
PyGILState_STATE gstate;
if (!nHold){gstate PyGILState_Ensure(); //如果没有GIL则申请获取GIL
}
Py_BEGIN_ALLOW_THREADS;
Py_BLOCK_THREADS;在调用python脚本后加入以下代码
Py_UNBLOCK_THREADS;
Py_END_ALLOW_THREADS;
if (!nHold) {PyGILState_Release(gstate); //释放当前线程的GIL
}问题分析
我使用C调用python脚本的方式
// 在main.cpp中初始化解释器
wchar_t *program Py_DecodeLocale(parkin_python, NULL);
if (program NULL) {fprintf(stderr, Py_DecodeLocale fail\n);return -1;
}
Py_SetProgramName(program);
Py_Initialize(); //初始化Python环境
if ( !Py_IsInitialized()) { //检测是否初始化成功return -2;
}// 在**.cpp中调用python脚本
... python模块、函数和函数参数 初始化
PyObject* ret_py_final_estimates PyObject_CallObject(pyfun_algorithm_mlem, args);
... python模块、函数和函数参数 释放通过检索以下参考链接尝试以下方式发现可行具体问题还在调研中。。。
C调用Python脚本还可以通过QProcess调用而通过管道进行数据传输。
参考链接
C 多线程调用Python脚本 记用C调用Python函数时遇到的一个死锁 C子线程中调用python代码