栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c++多线程调用python脚本

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++多线程调用python脚本

为什么?

1、提升效率。

2、一开始代码是在python中用了多进程,后面发现c++调用的Python代码是无法开启多进程的。由于Python解释器有全局解释所GIL的原因,导致在同一时刻只能有一个线程拥有解释器,所以在C++多线程调用python脚本时,需要控制GIL,线程获取GIL。

c++如何开启多线程

首先要引入头文件#include,管理线程的函数和类在该头文件中声明,其中包括std::thread类。

语句"std::thread th1(test);"创建了一个名为th1的线程。

join()是线程阻塞方法,主函数阻塞直到th1子线程运行完毕。

#include
#include
using namespace std;


void test()
{
  cout << "子线程运行" << endl;
  cout << "子线程id为" << this_thread::get_id() << endl;
}
int main()
{
  cout << "主线程" << endl;
  thread th1(test);
  cout << "主线程中显示子线程id为" << th1.get_id() << endl;
  th1.join();
  return 0;
}

结果:

c++多线程调用python脚本

此处涉及到c++与numpy之间的通信协议。(可以查看我之前写的:https://mp.weixin.qq.com/s/DJCCXXGH_2658p2ytMvZMw)

在C++多线程环境下,直接调用 api操作 Python解释器,肯定会导致 core dump, 因为 Python 绝大部分函数都是非线程安全的。由GIL控制访问顺序。

Python解释器不是完全线程安全的。为了支持多线程Python程序,有一个全局锁,称为 global interpreter lock or GIL,在当前线程能够安全访问Python对象之前,它必须由当前线程持有。没有锁,即使是最简单的操作也可能导致多线程程序中的问题。

话不多说,附上代码。改代码将一个800*512*512的ct图像分别放入4个不同的python线程计算,最后再将运行结果拿回来。

#include
#include"include/Python.h"
#include"arrayobject.h"
#include
#include
#include
using namespace std;
import numpy as np
import time
def ff(data,times):
    print(data.shape)
    data = data.reshape(-1)
    data = np.clip(data,200,3000)
    data = data.reshape(-1,512,512)
    time.sleep(times)
    return data
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/456900.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号