C++调用Python脚本进行18次循环操作后,脚本不执行

news/2024/10/30 16:34:03/

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代码


http://www.ppmy.cn/news/26849.html

相关文章

【Git】为什么需要版本控制?版本控制工具有那些?

目录 一、为什么需要版本控制? 二、版本控制工具有那些? 💟 创作不易,不妨点赞💚评论❤️收藏💙一下 一、为什么需要版本控制? 首先我们要知道什么是版本控制?对版本控制进行文字…

Java环境变量配置

一、Path环境变量配置设置环境变量的值:C:\Program Files\Java\jdk-17\bin目前较新的JDK安装时会自动配置javac、java程序的路径到Path环境变量中去 ,因此,javac、java可以直接使用。注意:以前的老版本的JDK在安装的是没有自动配置…

resp连接redis服务器

修改redis的配置文件使得windows的图形界面客户端可以连接redis服务器 resp安装好以后,可以在linux端打开redis.conf中做以下操作,使得windows的图形界面客户端可以连接redis服务器 方法一: 1,在redis.conf文件中添加bind 在文件…

Rust编程细节知识点拾遗

1.Rust中每一个引用都有生命周期,也就是引用保持有效的作用域。生命周期主要目标是避免悬垂引用,悬垂引用就是引用了已经释放的值。函数中,x的生命周期不能小于返回值得生命周期。当有x和y的时候,两者的生命周期是两个里面较小的那…

QHash-官翻

QHash 类 template <typename Key, typename T> class QHash QHash 类是一种模板类&#xff0c;提供基于哈希表的字典类结构。更多内容… 头文件:#include <QHash>qmake:QT core派生类:QMultiHash 所有成员列表&#xff0c;包括继承的成员废弃的成员 注意&…

微服务之Eureka

&#x1f3e0;个人主页&#xff1a;阿杰的博客 &#x1f4aa;个人简介&#xff1a;大家好&#xff0c;我是阿杰&#xff0c;一个正在努力让自己变得更好的男人&#x1f468; 目前状况&#x1f389;&#xff1a;24届毕业生&#xff0c;奋斗在找实习的路上&#x1f31f; &#x1…

唤醒手腕 Java 后端 Springboot 结合 Redis 数据库学习笔记(更新中)

Redis 基本介绍 Redis Introduction The open source, in-memory data store used by millions of developers as a database, cache, streaming engine, and message broker. 基本概念&#xff1a;redis 是一个开源的、使用 C 语言编写的、支持网络交互的、可基于内存也可持…

Qt中的多线程

Qt中有多种方法实现多线程&#xff1a; QThreadQThreadPool和QPunnable&#xff08;重用线程&#xff09;Qt ConcurrentWorkerScript&#xff08;QML中的线程&#xff09;QThread 在上两篇文章中已经解释了&#xff0c;这里就不再赘述。 QThreadPoo和QRunnable&#xff08;实现…