经测试发现上次写的
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()**在多线程里可能会报内存问题,特别是循环调用时
如有大佬路过有解法,恳请评论区指导我!!!