当前位置: 首页 > news >正文

C++多线程中调用python api函数

错误场景:一直等待全局锁。

  

解决方法:

一、首先定义一个封装类,主要是保证PyGILState_Ensure, PyGILState_Release配对使用,而且这个类是可以嵌套使用的。

#include <python.h>

class PyThreadStateLock
{
public:
    PyThreadStateLock(void)
    {
        state = PyGILState_Ensure( );
    }

    ~PyThreadStateLock(void)
    {
         PyGILState_Release( state );
    }
private:
    PyGILState_STATE state;
};


二、在主线程中,这样处理

   // 初始化
    Py_Initialize();
    // 初始化线程支持
    PyEval_InitThreads();
    // 启动子线程前执行,为了释放PyEval_InitThreads获得的全局锁,否则子线程可能无法获取到全局锁。
    PyEval_ReleaseThread(PyThreadState_Get());
    
    // 其他的处理,如启动子线程等
    ......
        
    // 保证子线程调用都结束后
    PyGILState_Ensure();
    Py_Finalize();
    // 之后不能再调用任何python的API

 

三、在主线程,或者子线程中,调用python本身函数的都采用如下处理

    {
        class PyThreadStateLock PyThreadLock;  //获取全局锁
        // 调用python的API函数处理
        ......
    }
   //作用域结束,PyThreadLock析构,释放全局锁

 

转载于:https://www.cnblogs.com/SZxiaochun/p/7692698.html

相关文章:

  • Gridview的footer模板中放置控件实现添加功能
  • 如何更高效地使用 OkHttp
  • BZOJ-3713[PA2014]Iloczyn
  • Spring绑定请求参数过程以及使用@InitBinder来注册自己的属性处理器
  • 铁路(栈)
  • Aspose------导入Excel
  • 生活:高效且健康的生活习惯
  • value toDF is not a member of org.apache.spark.rdd.RDD
  • MySql中把一个表的数据插入到另一个表中的实现代码
  • 图片定位问题
  • xencenter如何安装系统
  • ASP.NET MVC Model元数据及其定制: Model元数据的定制
  • 04-String
  • 社工-入侵
  • Spring声明式事务管理之一:五大属性分析
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Git 使用集
  • laravel 用artisan创建自己的模板
  • Markdown 语法简单说明
  • node学习系列之简单文件上传
  • PAT A1120
  • Python十分钟制作属于你自己的个性logo
  • Spring Cloud中负载均衡器概览
  • 多线程事务回滚
  • 写代码的正确姿势
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • ionic异常记录
  • #laravel 通过手动安装依赖PHPExcel#
  • #图像处理
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (LeetCode C++)盛最多水的容器
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (三十五)大数据实战——Superset可视化平台搭建
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)原始图像数据和PDF中的图像数据
  • ***测试-HTTP方法
  • .Net Remoting常用部署结构
  • .net反编译的九款神器
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • .net下简单快捷的数值高低位切换
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [20180129]bash显示path环境变量.txt
  • [AAuto]给百宝箱增加娱乐功能
  • [BZOJ 3531][Sdoi2014]旅行(树链剖分+线段树)
  • [C#]winform部署yolov5-onnx模型
  • [C++] new和delete
  • [CVPR2021]Birds of a Feather: Capturing Avian Shape Models from Images