CMake下调用anaconda的pytorch及numpy传参CV::Mat给python(多线程版)

2023-11-16

经测试发现上次写的
CMake下调用anaconda的pytorch及numpy传参CV::Mat给python
在多线程下就挂了…… 经过各种实验,终于完成了多线程的实现,在此分享一下:

主要结构如下:

//
// Created by daybeha on 2022/7/8.
//

//c++ python联合编程 问题记录
//
//        多线程下代码框架完成,
//但Mat转numpy的核心函数 PyArray_SimpleNewFromData()在第三次调用时会报段错误


#define PY_SSIZE_T_CLEAN

#include <Python.h>
#include <iostream>
#include <opencv2/opencv.hpp>
#include "numpy/arrayobject.h"
#include <stdio.h>
//#include <time.h>
//#include <pthread.h>

#include <thread>
#include "loopclose.h"

using namespace std;


const char *python_modle = "sg_match";
//const char * python_func =  "compute_score";
const char *python_func = "con_show";
//const char * python_func =  "show_img";


void fun() {
    //文献[3]中在此处需要调用PyGILState_Check()检测当前线程是否拥有GIL,
    //但我的环境并不能编译PyGILState_Check,但我实测没有PyGILState_Check也OK.
    PyGILState_STATE gstate;
    gstate = PyGILState_Ensure();   //如果没有GIL,则申请获取GIL
    Py_BEGIN_ALLOW_THREADS;
        Py_BLOCK_THREADS;
        
        // 调用Python C API函数,如PyRun_SimpleString、PyImport_Import、PyObject_CallObject、……
        
        Py_UNBLOCK_THREADS;
    Py_END_ALLOW_THREADS;
    PyGILState_Release(gstate);    //释放当前线程的GIL
}


int main() {
    //初始化Python环境,如果是C++ class,可以将这一部分放到class的构造函数中去。
    //**********************************************
    Py_Initialize(); //初始化Python环境
    if (!Py_IsInitialized()) //检测是否初始化成功
    {
        return -1;
    } else {
        PyEval_InitThreads();     //开启多线程支持
        int nInit = PyEval_ThreadsInitialized();  //检测线程支持是否开启成功
        if (nInit) {
            PyEval_SaveThread();  //因为调用PyEval_InitThreads成功后,当前线程就拥有了GIL,释放当前线程的GIL,
        }
    }

    thread *a = new thread(fun);

//    loopclose *lc = new loopclose();
//    thread *b = new thread(&loopclose::run, lc);
//
//    b->join();
//    cout << "b finished!" << endl;
    a->join();
    cout << "a finished!" << endl;


    //结束Python环境,如果是C++ class,可以将这一部分放到class的析构函数中去。
    //**********************************************
//    PyGILState_Ensure();
    Py_Finalize();
    //**********************************************
    return 0;
}

编译方式参考:ROS+Pytorch的联合使用示例(语义分割)

catkin_make -DPYTHON_EXECUTABLE=/home/daybeha/anaconda3/envs/pytorch/bin/python -DPYTHON_INCLUDE_DIR=/home/daybeha/anaconda3/envs/pytorch/include/python3.9 -DPYTHON_LIBRARY=/home/daybeha/anaconda3/envs/pytorch/lib/libpython3.9.so -DCMAKE_BUILD_TYPE=Release -DSETUPTOOLS_DEB_LAYOUT=OFF

有一个需要注意的问题:

cv::Mat转 numpy的函数 **PyArray_SimpleNewFromData()**在多线程里可能会报内存问题,特别是循环调用时

如有大佬路过有解法,恳请评论区指导我!!!

Reference

【Python笔记1.1】C/C++多线程调Python

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake下调用anaconda的pytorch及numpy传参CV::Mat给python(多线程版) 的相关文章

随机推荐

  • AI算法工程师面试题基础精选

    AI算法工程师的相关面试题包括机器学习 深度学习以及强化学习等等 在面试时由于涉及范围比较广泛 一般面试官不会问一些比较深比较偏的问题 一般都会结合你经手的项目或者在校期间的项目进行一些算法的基础问题进行提问 在这里我们对在面试中常见中的基
  • 分享CSS3里box-shadow属性的使用方法,包括内阴影box-shadow:inset

    一 box shadow语法 box shadow none inset 可选值 不设置 为外投影 设置 为内投影 x offset 阴影水平偏移量 正方向为right y offset 阴影垂直偏移量 正方向为bottom blur ra
  • 记录好项目D16

    记录好项目 你好呀 这里是我专门记录一下从某些地方收集起来的项目 对项目修改 进行添砖加瓦 变成自己的闪亮项目 修修补补也可以成为毕设哦 本次的项目是个电影购票系统 一 系统介绍 前台 普通用户注册 登录 注销 用户信息修改 邮箱 密码 头
  • Qt编译时,出现 first defined here,原因及解决方法

    场景 今天想着把之前写过的模块 都整合到一起 结果一编译程序就出现这个错误 原因 因为头文件出现重复包含了 后来我想了一下 我每个模块都是独立编写的 怎么会重复呢 然后去了pro文件里看了一下 里面果然有两个一模一样的头文件名 QT诚不欺我
  • Newtonsoft.Json基本使用

    Newtonsoft Json基本使用 使用强类型进行序列化反序列化 准备一个学生类 public class Student public string Name get set public int Age get set public
  • Android系统启动流程

    文章目录 总结 1 rc脚本语法规则 2 init进程启动 init first stage init second stage 3 ServiceManager启动 4 Zygote进程启动 5 Launcher启动 总结 android
  • [sql]使用sql语句增加列,并且设置默认值

    有的时候 我们需要对已存在的表进行插入列的情况 当然 可以使用navicat等工具直接可视化操作 命令行的话 如下 alter table 表名 add column 列名 数据类型 default 默认值 demo alter table
  • flutter开发实战-MethodChannel实现flutter与iOS双向通信

    flutter开发实战 MethodChannel实现flutter与iOS双向通信 最近开发中需要iOS与flutter实现通信 这里使用的MethodChannel 如果需要flutter与Android实现双向通信 请看 https
  • O-RAN专题系列-38:管理面-WG4.MP.V07-规范解读-第5章-软件管理

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 第5章 软件管理 5 1 Software Package 5 2 Software Inventory消息 5 3 Software
  • @Transactional事务注解

    1 实现原理 基于AOP面向切面的 它将具体业务与事务处理部分解耦 代码侵入性很低 2 Transactional注解可以作用于哪些地方 作用于类 当把 Transactional 注解放在类上时 表示所有该类的public方法都配置相同的
  • 使用正则表达式验证邮箱格式?

    需满足的验证逻辑 1 之前必须有内容且只能是字母 大小写 数字 下划线 减号 点 2 和最后一个点 之间必须有内容且只能是字母 大小写 数字 点 减号 且两个点不能挨着 3 最后一个点 之后必须有内容且内容只能是字母 大小写 数字且长度为大
  • python @register_第7.21节 Python抽象类—register注册虚拟子类

    上两节介绍了Python抽象类的真实子类的定义和使用 本节介绍另一种抽象类的实现方法 虚拟子类方法 一 相关概念 虚拟子类是将其他的不是从抽象基类派生的类 注册 到抽象基类 让Python解释器将该类作为抽象基类的子类使用 因此称为虚拟子类
  • Lua中的协程Coroutine

    一 协程是什么 1 线程 首先复习一下多线程 我们都知道线程 Thread 每一个线程都代表一个执行序列 当我们在程序中创建多线程的时候 看起来 同一时刻多个线程是同时执行的 不过实质上多个线程是并发的 因为只有一个CPU 所以实质上同一个
  • android语言切换的源码逻辑

    android语言的分发 会通过AMS去分发 AMS中保存着正在运行的进程 并分别分发给各个进程 各个进程在收到对应的事件的时候 会重启当前的页面 来应用config的改变 页面重启的过程中 Resource会读取当前的config 根据保
  • 【编程练习】回转寿司

    题目来源 牛客 美团2021校招笔试编程题 第3题 题目描述 题解 参考了别人的思路 这个问题可以分解为经典贪心 回转 当不考虑回转 环形 情形时 只需要用贪心求解最大连续子串值即可 当考虑回转 环形 情形时 可反向思考 就是 求解非环形连
  • matlab神经网络工具箱实现两个输入的BP神经网络

    请问各位大佬 matlab神经网络工具箱怎么实现具有两个特征的BP神经网络啊 是将以行为单位将每个样本的每一个特征按列存放就可以吗
  • upload-labs第1~2关 小试牛刀

    第一关 文件重命名 工具 Burp 蚁剑 原理 文件名修改 源码解析 先在前端判断是否为图片格式 是的话 就开始上传 也就是前端绕过 先传一个jpg格式的 再用burp抓包 改包 就可以实现前端验证绕过 绕过过程 文件上传肯定离不开一句话木
  • 全球根服务器分别部署在哪里?

    全球真的只有13台根服务器么 10台根服务器都在美国 如果根服务器被关闭 我们会不会被断网 关于DNS部署与根服务器的几点论述 知名网络黑客防御专家 东方联盟创始人郭盛华透露 根名称服务器是任何域名系统 DNS 服务器 它响应 DNS 根区
  • AI Challenger 2018 即将进入决赛,八大数据集抢先看

    雷锋网 AI 研习社消息 由创新工场 搜狗 美团点评 美图联合主办的 AI Challenger 2018 即将进入第二阶段比赛 今年的大赛主题是 用 AI 挑战真实世界的问题 主办方提供超过 300 万人民币奖金 8 月 29 日至 11
  • CMake下调用anaconda的pytorch及numpy传参CV::Mat给python(多线程版)

    经测试发现上次写的 CMake下调用anaconda的pytorch及numpy传参CV Mat给python 在多线程下就挂了 经过各种实验 终于完成了多线程的实现 在此分享一下 主要结构如下 Created by daybeha on