C++ und Python
@Centurius: dazu müßte man wissen, wie Du die Einbindung von Python in Dein C++-Programm gestalten willst. Wenn Du multithreaded arbeitest, mußt Du aufpassen, dass immer, wenn Du etwas im Python-Bereich ändern willst, das GIL anfordern mußt und entsprechend auch wieder freigeben, wenn Du fertig bist.
Es ist so das ich eine DLL erstelle. Diese DLL lädt mehrere Python Module um als eine Schnittstelle zwischen einem Programm und mehreren Python Modulen zu fungieren.
Bedeutetet das Programm ruft nach dem Laden der Python Module immer mal auf deren Funktionen zu. Das läuft alles bisher ohne Threads, was bedeutet, wenn man eine while true Schleife einbaut, wäre das Programm in der Python Funktion gefangen und benutze ich Threads wird der gesleept sobald die Funktion in dem Python Module durch ist.
Wie gehe ich nun am besten vor um das Problem zu lösen?
Bedeutetet das Programm ruft nach dem Laden der Python Module immer mal auf deren Funktionen zu. Das läuft alles bisher ohne Threads, was bedeutet, wenn man eine while true Schleife einbaut, wäre das Programm in der Python Funktion gefangen und benutze ich Threads wird der gesleept sobald die Funktion in dem Python Module durch ist.
Wie gehe ich nun am besten vor um das Problem zu lösen?
Keine while-schleife erstellen? Kooperativer Code waere denke ich die zu bevorzugende Loesung.
Ansonsten koenntest du versuchen, aus c++ in einem Timer immer wieder einen Callback in Python aufzurufen, der letztlich nix tut, aber eben Interpreter-Hausarbeit (implizit) verrichtet. So zumindest verstehe ich das Problem.
Ansonsten koenntest du versuchen, aus c++ in einem Timer immer wieder einen Callback in Python aufzurufen, der letztlich nix tut, aber eben Interpreter-Hausarbeit (implizit) verrichtet. So zumindest verstehe ich das Problem.
Dir ist klar, dass die in Python ueblicherweise keinen Gewinn in punkto Performance bringen? Wie dem auch sei, auch fuer den Fall habe ich ja eine Idee vorgeschlagen. Ob die funktioniert wirst du schon ausprobieren muessen.
@Centurius: Python macht da auch keine Magie. Wenn Du in Python einen Thread erzeugst, ist das ein ganz normaler Thread vom Betriebssystem. Du mußt nur darauf achten, dass, wenn Du in Deinem C++-Teil bist, das GIL nicht gelocked ist und wenn Du wieder eine Python-Funktion aufrufst, das GIL wieder aquiriert wird. Was hast Du denn schon ausprobiert, und wo verhält sich das Programm nicht so wie Du es erwartest?
Es stoppt den Thread leider solange wie die C++ nicht in dem Python Script tätig ist.
Sprich ich importiere ein Python Script, das ein Thread startet. Nachdem dem der Thread gestartet wurde wird er schlafen gelegt, bis ich eine Funktion in dem Python Script ausführe und sobald die Funktion durch geführt wurde, wird der Thread wieder schlafen gelegt.
Sprich ich importiere ein Python Script, das ein Thread startet. Nachdem dem der Thread gestartet wurde wird er schlafen gelegt, bis ich eine Funktion in dem Python Script ausführe und sobald die Funktion durch geführt wurde, wird der Thread wieder schlafen gelegt.
Das haben wir schon verstanden. Was passiert, wenn du periodisch aus deinem C++ Haupt-Thread in den Python-Interpreter verzweigst? Eine einfache nop-Funktion, deren Zweck nur darin besteht, dem Interpreter ein bisschen CPU-Zyklen-Luft schnuppern zu lassen.
@__deets__: das bringt gar nichts, weil die nop-Operation nicht dafür sorgt, dass andere Threads ausgeführt werden.
@Centurius: Du hast noch kein bißchen auf meinen Vorschlag reagiert, den ich gemacht habe.
Wenn Du eine Anbindung von Python an C/C++ haben willst, dann solltest Du Dich auch mit der Dokumentation dazu etwas beschäftigen.
Also hier lesen, das sollte Dir alle Fragen beantworten.
Beispiel:
[codebox=c file=Unbenannt.c]
#include <Python.h>
PyThreadState* global_thread;
int main(int argc, char *argv[])
{
Py_SetProgramName(argv[0]); /* optional but recommended */
Py_Initialize();
PyRun_SimpleString("import time,threading\n"
"def gg():\n"
" for i in range(15): print i;time.sleep(1)\n"
"threading.Thread(target=gg).start()\n");
global_thread = PyThreadState_Get();
PyEval_ReleaseThread(global_thread);
printf("Start\n");
sleep(10);
printf("Stop\n");
PyEval_AcquireThread(global_thread);
Py_Finalize();
return 0;
}[/code]
@Centurius: Du hast noch kein bißchen auf meinen Vorschlag reagiert, den ich gemacht habe.
Wenn Du eine Anbindung von Python an C/C++ haben willst, dann solltest Du Dich auch mit der Dokumentation dazu etwas beschäftigen.
Also hier lesen, das sollte Dir alle Fragen beantworten.
Beispiel:
[codebox=c file=Unbenannt.c]
#include <Python.h>
PyThreadState* global_thread;
int main(int argc, char *argv[])
{
Py_SetProgramName(argv[0]); /* optional but recommended */
Py_Initialize();
PyRun_SimpleString("import time,threading\n"
"def gg():\n"
" for i in range(15): print i;time.sleep(1)\n"
"threading.Thread(target=gg).start()\n");
global_thread = PyThreadState_Get();
PyEval_ReleaseThread(global_thread);
printf("Start\n");
sleep(10);
printf("Stop\n");
PyEval_AcquireThread(global_thread);
Py_Finalize();
return 0;
}[/code]
Ich komme dem ganzen näher. Ein Thread läuft weiter wie er soll.
Nun habe ich das Problem, wenn ich ein weiteres Python Script importiere es abstürzt, wenn ich es vor PyEval_AcquireThread(global_thread); importiere.
Wahrscheinlich muss ich jetzt den Thread stoppen, das Python Script importieren und dann den Thread weiterlaufen lassen oder?
Wenn ja wie mache ich das?
Nun habe ich das Problem, wenn ich ein weiteres Python Script importiere es abstürzt, wenn ich es vor PyEval_AcquireThread(global_thread); importiere.
Wahrscheinlich muss ich jetzt den Thread stoppen, das Python Script importieren und dann den Thread weiterlaufen lassen oder?
Wenn ja wie mache ich das?
@Centurius: alle Threads laufen im Hintergrund, aber jedesmal wenn Du vom Hauptprogramm aus eine Python-Funktion aufrufen willst, mußt Du erst Acquire und wenn Du fertig bist Release aufrufen. Hast Du die Dokumentation gelesen und verstanden?
Das hatte ich auch so verstanden, aber es funktionierte leider nicht so.
Ich probiere es heute nachmittag nochmal.
Muss ich vor dem Release nochmal global_thread = PyThreadState_Get(); ausführen?
Was ist wenn in dem dazwischen ausgeführten Python Code auch ein Thread ist?
Ich probiere es heute nachmittag nochmal.
Muss ich vor dem Release nochmal global_thread = PyThreadState_Get(); ausführen?
Was ist wenn in dem dazwischen ausgeführten Python Code auch ein Thread ist?