我需要编写代码来进行一些计算复杂的实时处理.我想创建一些Python类来管理我的所有脚本,并将算法的密集部分保留在C++中,以便它们能够尽可能快地运行.我想在Python中实例化对象,并让C++算法在python中回调到回调中.就像是:
myObject = MyObject()
myObject.setCallback(myCallback)
myObject.run()
def myCallback(val):
"""Do something with the value passed back to the python script."""
pass
Run Code Online (Sandbox Code Playgroud)
这有可能吗?如何在C++模块中运行的循环中运行python中的回调?任何人都有一个链接或教程,以帮助我正确地做到这一点?
我正在开发一个程序,使用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);
}
};
Run Code Online (Sandbox Code Playgroud)
问题来了,DirectShow的一个线程调用我的PythonCallback,即在Python中调用该函数.一旦调用,我的程序就崩溃了.我发现这应该是线程问题.然后我找到了这个文件:
http://docs.python.org/c-api/init.html
似乎我的程序不能直接从线程调用Python的函数,因为有Global Interpreter Lock.python的GIL非常复杂,我不知道它是如何工作的.对不起,我能做的就是问.我的问题是.在从线程调用Python函数之前和之后我应该怎么做?
它可能看起来像这样.
void operator() (double time, const AudioData &data) {
// acquire lock
m_Function(time, data);
// release lock
}
Run Code Online (Sandbox Code Playgroud)
谢谢.林维克.