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

经测试发现上次写的
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昼行plus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值