2010-05-31 5 views
5

Ich muss Code schreiben, um einige Echtzeit-Verarbeitung zu tun, die ziemlich rechenintensiv ist. Ich möchte einige Python-Klassen erstellen, um alle meine Skripts zu verwalten, und die intensiven Teile des Algorithmus in C++ so hinterlegen, dass sie so schnell wie möglich ausgeführt werden können. Ich möchte die Objekte in Python instanziieren und die C++ - Algorithmen mit Callbacks in Python in das Skript zurückgeben lassen. Etwas wie:Echtzeit-Verarbeitung und Rückrufe mit Python und C++

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

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

Wird dies möglich sein? Wie kann ich einen Rückruf in Python von einer Schleife ausführen, die in einem C++ - Modul ausgeführt wird? Jeder hat einen Link oder ein Tutorial, um mir zu helfen, dies richtig zu machen?

Antwort

3

Ich empfehle die Verwendung von Boost.Python wie von ChristopheD vorgeschlagen. Ein Fehler wäre, wenn die C++ Erweiterung in einem eigenen Thread-Kontext (nicht von Python erstellt) läuft. Wenn das der Fall ist, stellen Sie sicher, dass Sie die Funktionen PyGILState_Ensure() and PyGILState_Release() beim Aufrufen von Python-Code aus C++ verwenden.

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

ab Version 2.3, Gewinde können jetzt die Vorteile der PyGILState nehmen _ *() Funktionen automatisch alle die oben zu tun. Das typische Idiom für den Aufruf in Python aus einem Thread C ist jetzt:

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) 

Ich empfehle & süß die Rückrufe kurz zu machen - die Notwendigkeit zu begrenzen Ausnahmebehandlung in C++ Code auszuführen. Wenn Sie wxPython verwenden, können Sie das robuste asynchrone Ereignissystem verwenden. Oder die Callbacks könnten Ereignisse in eine Warteschlange stellen und Sie könnten einen Thread haben, der für die asynchrone Ausführung von Callback/Event-Code zuständig ist.

Selbst mit Boost.Python Magie, müssen Sie sich mit diesem Teil der Python C API im Umgang mit Threads vertraut machen. (Vergessen Sie nicht, die C++ - Funktionen mit Py_BEGIN_ALLOW_THREADS und Py_END_ALLOW_THREADS zu verpacken, um die GIL freizugeben!)

0

Here ist ein Beispiel für die Durchführung von Python-Callbacks mit Cython. Es könnte sich lohnen, auch Pyrex zu betrachten. Beide können die Integration von C/C++ mit Python ziemlich einfach machen.

0

Wir tun, was Sie bei der Arbeit tun. Wir mögen Python, aber manchmal ist es einfach nicht schnell genug.
Boost und Swig sind beide gut dafür. Sie sollten auch diesen Link auf Python Performance überprüfen, sie sprechen ein wenig über NumPy, die Ihnen helfen können.