Cómo llamar a una función python desde un hilo de idioma extranjero (C ++)

Estoy desarrollando un progtwig que utiliza DirectShow para capturar datos de audio de archivos multimedia. DirectShow usa el hilo para pasar datos de audio a la función de callback en mi progtwig, y ​​dejo que esa función de callback llame a otra función en Python.

Utilizo Boost.Python para envolver mi biblioteca, la función de callback:

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); } }; 

Aquí viene el problema, un hilo de DirectShow llama a mi PythonCallback, es decir, llama a la función en Python. Una vez que llama, mi progtwig simplemente se bloquea. He encontrado que esto debería ser un problema de hilos. Entonces encontré este documento:

http://docs.python.org/c-api/init.html

Parece que mi progtwig no puede llamar a la función de Python desde el hilo directamente, porque hay un locking de intérprete global. El GIL del python es tan complejo, no tengo idea de cómo funciona. Lo siento, lo que puedo hacer es preguntar. Mi pregunta es. ¿Qué debo hacer antes y después de llamar a una función de Python desde subprocesos?

Puede verse así.

 void operator() (double time, const AudioData &data) { // acquire lock m_Function(time, data); // release lock } 

Gracias. Victor Lin.

Eche un vistazo a PyGILState_Ensure () / PyGILState_Release (), de PEP 311 http://www.python.org/dev/peps/pep-0311/

Aquí hay un ejemplo tomado del propio 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); } 

Haga que la callback de c ++ coloque los datos en una cola. Haga que el código de Python sondee la cola para extraer los datos.