C++多线程中调用python api函数
2008-09-17 10:39
260 查看
C++多线程中调用python api函数收藏
天看了近一天关于多线程的应用中,如何安全调用python方面的资料,开始的时候看的简直头大如斗,被python语言的全局锁(Global
Interpreter Lock)、线程状态(Thread State
)等都有点绕晕了,后来经过各方面文章和帮助文档的相互参考,发现对于2.4/2.5版本,提供了PyGILState_Ensure,
PyGILState_Release,哎,这下可方便大发了。
一、首先定义一个封装类,主要是保证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函数处理
......
}
新一篇: 看看一笑:终于知道为什么国内股票市场前几天动荡了 | 旧一篇: 转贴:为何将“流氓政权”译为“流氓国家”?
function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}今天看了近一天关于多线程的应用中,如何安全调用python方面的资料,开始的时候看的简直头大如斗,被python语言的全局锁(Global
Interpreter Lock)、线程状态(Thread State
)等都有点绕晕了,后来经过各方面文章和帮助文档的相互参考,发现对于2.4/2.5版本,提供了PyGILState_Ensure,
PyGILState_Release,哎,这下可方便大发了。
一、首先定义一个封装类,主要是保证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函数处理
......
}
相关文章推荐
- C++多线程中调用python api函数
- C++多线程中调用python api函数
- C++多线程中调用python api函数
- C++多线程中调用python api函数
- C++多线程中调用python api函数 GIL的使用
- 转:c++多线程调用python
- C++多线程调用Python多进程
- C++ 多线程调用Python脚本
- Python调用C/C++的种种方法
- Python调用C/C++互相调用
- 利用Swig在python中调用C/C++代码
- C++ 调用Python3 脚本中无法引入内建模块的问题 解决方法
- JAVA学习(13) JAVA/C++互相调用 以及多线程
- C++与Python的混合编程-环境配置与调用无参函数
- C,C++代码中调用python脚本
- 【python】c++调用python文件设置参数Py_BuildValue()
- python 3 调用c/c++ 动态链接库 *.dll
- 使用Visual Studio,几步实现Python C++扩展,以及DLL调用
- C++调用Python环境
- Python调用C/C++的种种方法