C++多线程中调用python api函数 GIL的使用
来源:互联网 发布:曼隆学院 知乎 编辑:程序博客网 时间:2024/05/17 08:52
一、首先定义一个封装类,主要是保证PyGILState_Ensure, PyGILState_Release配对使用,而且这个类是可以嵌套使用的。
#include <python.h>
class PyThreadStateLock
{
public:
PyThreadStateLock(void)
{
state = PyGILState_Ensure( );
}
~PyThreadStateLock(void)
{
PyGILState_Release( state );
}
private:
PyGILState_STATE state;
};
二、在主线程中,这样处理
// 初始化
Py_Initialize();
// 初始化线程支持
PyEval_InitThreads();
// 启动子线程前执行,为了释放PyEval_InitThreads获得的全局锁,否则子线程可能无法获取到全局锁。
PyEval_ReleaseThread(PyThreadState_Get());
// 其他的处理,如启动子线程等
......
// 保证子线程调用都结束后
PyGILState_Ensure();
Py_Finalize();
// 之后不能再调用任何python的API
三、在主线程,或者子线程中,调用python本身函数的都采用如下处理
{
class PyThreadStateLock PyThreadLock;
// 调用python的API函数处理
......
}
呵呵,看这样是否非常简单了。
另外还有两个和全局锁有关的宏,Py_BEGIN_ALLOW_THREADS 和 Py_END_ALLOW_THREADS。这两个宏是为了在较长时间的C函数调用前,临时释放全局锁,完成后重新获取全局锁,以避免阻塞其他python的线程继续运行。这两个宏可以这样调用
{
class PyThreadStateLock PyThreadLock;
// 调用python的API函数处理
......
Py_BEGIN_ALLOW_THREADS
// 调用需要长时间的C函数
......
Py_END_ALLOW_THREADS
// 调用python的API函数处理
......
}
#include <python.h>
class PyThreadStateLock
{
public:
PyThreadStateLock(void)
{
state = PyGILState_Ensure( );
}
~PyThreadStateLock(void)
{
PyGILState_Release( state );
}
private:
PyGILState_STATE state;
};
二、在主线程中,这样处理
// 初始化
Py_Initialize();
// 初始化线程支持
PyEval_InitThreads();
// 启动子线程前执行,为了释放PyEval_InitThreads获得的全局锁,否则子线程可能无法获取到全局锁。
PyEval_ReleaseThread(PyThreadState_Get());
// 其他的处理,如启动子线程等
......
// 保证子线程调用都结束后
PyGILState_Ensure();
Py_Finalize();
// 之后不能再调用任何python的API
三、在主线程,或者子线程中,调用python本身函数的都采用如下处理
{
class PyThreadStateLock PyThreadLock;
// 调用python的API函数处理
......
}
呵呵,看这样是否非常简单了。
另外还有两个和全局锁有关的宏,Py_BEGIN_ALLOW_THREADS 和 Py_END_ALLOW_THREADS。这两个宏是为了在较长时间的C函数调用前,临时释放全局锁,完成后重新获取全局锁,以避免阻塞其他python的线程继续运行。这两个宏可以这样调用
{
class PyThreadStateLock PyThreadLock;
// 调用python的API函数处理
......
Py_BEGIN_ALLOW_THREADS
// 调用需要长时间的C函数
......
Py_END_ALLOW_THREADS
// 调用python的API函数处理
......
}
阅读全文
0 0
- C++多线程中调用python api函数 GIL的使用
- python中GIL问题(多线程问题,调用的函数用C语言写)
- Python C API关于GIL的细节
- python中多线程中GIL的介绍
- C++多线程中调用python api函数
- C++多线程中调用python api函数
- C++多线程中调用python api函数
- C++多线程中调用python api函数
- 多线程C调用python api的陷阱
- 多线程C调用python api的陷阱
- python中多线程调度机制以及GIL
- 谈谈python的GIL、多线程、多进程
- 谈谈python的GIL、多线程、多进程
- 谈谈python的GIL、多线程、多进程
- Python多线程与GIL
- 使用multiprocessing包规避Python GIL多线程串行问题
- Python 多线程 多进程 GIL
- Python, GIL, ctypes, Jython 多线程
- this
- 【KM算法 模板】HDU
- Split Linked List in Parts(LeetCode725)
- 编程求出1+2+3...+n的值
- contine语句
- C++多线程中调用python api函数 GIL的使用
- 多线程下载
- 多项式求和
- 1040. 有几个PAT(25)
- 国王将金币作为工资,发放给忠诚的骑士。
- C关于最小公倍数最大公约数关于小程序错误求教
- 空格后的小写字母变大写
- 【LeetCode算法练习(C++)】Substring with Concatenation of All Words
- 拦截器 图片glide 简单登录