我正在开发一个使用 DirectShow 从中获取音频数据的程序 媒体文件。 DirectShow 使用线程将音频数据传递给回调 函数在我的程序中,我让那个回调函数调用另一个 Python 中的函数。
我使用 Boost.Python 包装我的库,回调函数:
class PythonCallback {
private:
object m_Function;
public:
PythonCallback(object obj)
: m_Function(obj)
{}
void operator() (double time, const AudioData &data) {
// Call the callback function in python
m_Function(time, data);
}
};
问题来了,DirectShow的一个线程调用了我的 PythonCallback,即调用Python中的函数。一旦它调用,我的 程序刚刚崩溃。我发现这应该是线程问题。然后我 找到这个文件:
http://docs.python.org/c-api/init.html
看来我的程序不能从线程调用Python的函数 直接,因为有全局解释器锁。 python 的 GIL 太复杂了,我不知道它是如何工作的。对不起,我能做什么 是问。我的问题是。打电话之前和之后我应该做什么 来自线程的 Python 函数?
它可能看起来像这样。
void operator() (double time, const AudioData &data) {
// acquire lock
m_Function(time, data);
// release lock
}
谢谢。 维克托·林。
最佳答案
查看来自 PEP 311 的 PyGILState_Ensure()/PyGILState_Release() http://www.python.org/dev/peps/pep-0311/
这是从 PEP 本身获取的示例:
void SomeCFunction(void)
{
/* ensure we hold the lock */
PyGILState_STATE state = PyGILState_Ensure();
/* Use the Python API */
...
/* Restore the state of Python */
PyGILState_Release(state);
}
关于c++ - 如何从外语线程调用python函数(C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/510085/