2010-05-31 15 views
5

Ho bisogno di scrivere codice per fare un po 'di elaborazione in tempo reale che sia abbastanza computazionalmente complessa. Vorrei creare alcune classi Python per gestire tutti i miei scripting e lasciare le parti intensive dell'algoritmo codificate in C++ in modo che possano essere eseguite il più velocemente possibile. Vorrei creare un'istanza degli oggetti in Python e fare in modo che gli algoritmi C++ tornino nello script con i callback in python. Qualcosa di simile:Elaborazione in tempo reale e callback con Python e C++

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

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

Questo sarà possibile? Come posso eseguire una callback in python da un loop in esecuzione in un modulo C++? Qualcuno ha un link o un tutorial per aiutarmi a farlo correttamente?

risposta

3

Suggerisco di utilizzare Boost.Python come suggerito da ChristopheD. Un getcha sarebbe se l'estensione C++ fosse in esecuzione nel proprio contesto di thread (non creato da Python). In questo caso, assicurati di utilizzare le funzioni PyGILState_Ensure() and PyGILState_Release() quando chiami in codice Python da C++.

Dalla documentazione (http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock):

A partire dalla versione 2.3, le discussioni possono ora sfruttare la PyGILState _ * funzioni() per fare tutto quanto sopra automaticamente. Il tipico linguaggio per mettere in Python da un thread C è ora:

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) 

vi consiglio di fare i callback breve & dolce - per limitare la necessità di eseguire la gestione delle eccezioni nel codice C++. Se stai usando wxPython, potresti usare il suo robusto sistema di eventi asincroni. Oppure i callback potrebbero mettere eventi su una coda e potresti avere una discussione dedicata all'esecuzione asincrona del codice callback/evento.

Anche con la magia Boost.Python, è necessario acquisire familiarità con questa parte dell'API Python C quando si ha a che fare con i thread. (Non dimenticare di racchiudere le funzioni C++ con Py_BEGIN_ALLOW_THREADS e Py_END_ALLOW_THREADS per rilasciare GIL!)

0

Here è un esempio di come fare callback Python utilizzando Cython. Potrebbe valere la pena di guardare allo Pyrex. Entrambi possono rendere l'integrazione di C/C++ con Python piuttosto semplice.

0

Facciamo quello che stai facendo molto al lavoro. A noi piace Python ma a volte non è abbastanza veloce.
Boost e Swig sono entrambi buoni per farlo. Dovresti anche dare un'occhiata a questo link su Python Performance che parla un po 'di NumPy che potrebbe aiutarti.

Problemi correlati