gpt4 book ai didi

c++ - 如何从外语线程调用python函数(C++)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:33:12 27 4
gpt4 key购买 nike

我正在开发一个使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com