2010-05-31 13 views
5

Necesito escribir código para hacer un procesamiento en tiempo real bastante complejo desde el punto de vista computacional. Me gustaría crear algunas clases de Python para administrar todos mis scripts, y dejar las partes intensivas del algoritmo codificadas en C++ para que puedan ejecutarse lo más rápido posible. Me gustaría crear una instancia de los objetos en Python, y hacer que los algoritmos de C++ repiquen en la secuencia de comandos con devoluciones de llamada en Python. Algo como:Procesamiento en tiempo real y devoluciones de llamadas con Python y C++

myObject = MyObject() 
myObject.setCallback(myCallback) 
myObject.run() 

def myCallback(val): 
    """Do something with the value passed back to the python script.""" 
    pass 

¿Será esto posible? ¿Cómo puedo ejecutar una devolución de llamada en python desde un bucle que se ejecuta en un módulo de C++? ¿Alguien tiene un enlace o un tutorial para ayudarme a hacer esto correctamente?

Respuesta

3

Sugiero usar Boost.Python como lo sugiere ChristopheD. Un gotcha sería si la extensión de C++ se ejecuta en su propio contexto de subproceso (no creado por Python). Si ese es el caso, asegúrese de usar las funciones PyGILState_Ensure() and PyGILState_Release() al llamar al código de Python desde C++.

De la documentación (http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock):

Empezando con la versión 2.3, hilos pueden ahora beneficiarse de la PyGILState _ *() para hacer todo lo anterior automáticamente. La típica modismo para poner en Python desde un hilo C es ahora:

PyGILState_STATE gstate; 
gstate = PyGILState_Ensure(); 

/* Perform Python actions here. */ 
result = CallSomeFunction(); 
/* evaluate result */ 

/* Release the thread. No Python API allowed beyond this point. */ 
PyGILState_Release(gstate) 

Recomiendo hacer las devoluciones de llamada corta & dulce - para limitar la necesidad de llevar a cabo el manejo de excepciones en código C++. Si está usando wxPython, podría usar su robusto sistema de eventos asíncrono. O las devoluciones de llamada podrían poner eventos en una cola y podría tener un hilo dedicado a ejecutar de forma asíncrona el código de devolución de llamada/evento.

Incluso con la magia de Boost.Python, deberás familiarizarte con esta parte de la API de Python C cuando trabajes con hilos. (¡No olvide envolver las funciones de C++ con Py_BEGIN_ALLOW_THREADS y Py_END_ALLOW_THREADS para liberar el GIL!)

0

Here es un ejemplo de cómo hacer callbacks de pitón usando Cython. También vale la pena mirar Pyrex. Ambos pueden hacer que la integración de C/C++ con Python sea bastante fácil.

0

Hacemos lo que está haciendo mucho en el trabajo. Nos gusta Python pero a veces no es lo suficientemente rápido.
Boost y Swig son buenos para hacer eso. También debe consultar este enlace en Python Performance que hablan un poco acerca de NumPy que puede ayudarle.

Cuestiones relacionadas