我正在开发一个程序,使用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的函数,因为有Global Interpreter Lock.python的GIL非常复杂,我不知道它是如何工作的.对不起,我能做的就是问.我的问题是.在从线程调用Python函数之前和之后我应该怎么做?
它可能看起来像这样.
void operator() (double time, const AudioData &data) { // acquire lock m_Function(time, data); // release lock }
谢谢.林维克.
从PEP 311 http://www.python.org/dev/peps/pep-0311/查看PyGILState_Ensure()/ PyGILState_Release()
以下是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); }