網(wǎng)站首頁 編程語言 正文
經(jīng)測試發(fā)現(xiàn)上次寫的
CMake下調(diào)用anaconda的pytorch及numpy傳參CV::Mat給python
在多線程下就掛了…… 經(jīng)過各種實驗,終于完成了多線程的實現(xiàn),在此分享一下:
主要結(jié)構(gòu)如下:
//
// Created by daybeha on 2022/7/8.
//
//c++ python聯(lián)合編程 問題記錄
//
// 多線程下代碼框架完成,
//但Mat轉(zhuǎn)numpy的核心函數(shù) PyArray_SimpleNewFromData()在第三次調(diào)用時會報段錯誤
#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]中在此處需要調(diào)用PyGILState_Check()檢測當前線程是否擁有GIL,
//但我的環(huán)境并不能編譯PyGILState_Check,但我實測沒有PyGILState_Check也OK.
PyGILState_STATE gstate;
gstate = PyGILState_Ensure(); //如果沒有GIL,則申請獲取GIL
Py_BEGIN_ALLOW_THREADS;
Py_BLOCK_THREADS;
// 調(diào)用Python C API函數(shù),如PyRun_SimpleString、PyImport_Import、PyObject_CallObject、……
Py_UNBLOCK_THREADS;
Py_END_ALLOW_THREADS;
PyGILState_Release(gstate); //釋放當前線程的GIL
}
int main() {
//初始化Python環(huán)境,如果是C++ class,可以將這一部分放到class的構(gòu)造函數(shù)中去。
//**********************************************
Py_Initialize(); //初始化Python環(huán)境
if (!Py_IsInitialized()) //檢測是否初始化成功
{
return -1;
} else {
PyEval_InitThreads(); //開啟多線程支持
int nInit = PyEval_ThreadsInitialized(); //檢測線程支持是否開啟成功
if (nInit) {
PyEval_SaveThread(); //因為調(diào)用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;
//結(jié)束Python環(huán)境,如果是C++ class,可以將這一部分放到class的析構(gòu)函數(shù)中去。
//**********************************************
// PyGILState_Ensure();
Py_Finalize();
//**********************************************
return 0;
}
編譯方式參考:ROS+Pytorch的聯(lián)合使用示例(語義分割)
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轉(zhuǎn) numpy的函數(shù) **PyArray_SimpleNewFromData()**在多線程里可能會報內(nèi)存問題,特別是循環(huán)調(diào)用時
如有大佬路過有解法,懇請評論區(qū)指導我!!!
Reference
【Python筆記1.1】C/C++多線程調(diào)Python
原文鏈接:https://blog.csdn.net/weixin_48592526/article/details/125742379
相關(guān)推薦
- 2023-02-02 C#實現(xiàn)SMTP服務(wù)發(fā)送郵件的示例代碼_C#教程
- 2021-12-13 Gin?框架快速創(chuàng)建靜態(tài)文件下載Web服務(wù)_Golang
- 2023-05-23 golang中的單引號轉(zhuǎn)義問題_Golang
- 2022-10-10 ASP.NET?MVC使用jQuery?ui的progressbar實現(xiàn)進度條_實用技巧
- 2023-08-30 Linux下查找和刪除7天以前的文件
- 2023-02-15 Android音視頻開發(fā)只硬件解碼組件MediaCodec講解_Android
- 2022-07-15 Android自定義view實現(xiàn)圓形進度條效果_Android
- 2023-03-11 Golang的Fork/Join實現(xiàn)代碼_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支