C-API Threading?!

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
Krauzi
User
Beiträge: 77
Registriert: Montag 22. Oktober 2007, 18:06
Kontaktdaten:

Donnerstag 4. März 2010, 19:57

Hi leute ich arbeite gerade an einem eingebundenen python für ein c++ programm. Nur irgendwie will das threading nicht klappen.

Code: Alles auswählen

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);
-> so steht es in der doc, jedoch klappt das auch nicht.
ich habe auch schon mit Py_BEGIN_ALLOW_THREADS etc rumexperimentiert - leider ohne erfolg. Hat jemand schon erfahrung damit und kann mir hier helfen, das ganze zum laufen zu bekommen?
Boost threads wollte ich eigentlich nicht unbedingt einsetzten, weil ich hier probleme mit den PyObjects bekomme (die für die für boost thread benötigten klassen immer increfed, decrefed, etc. werden müssen).

Hoffe mir kann jemand helfen.
MfG Krauzi
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Freitag 5. März 2010, 08:37

Hallo,

ich kann leider keine Lösung anbieten - aber das Thema interessiert mich.

Kannst Du uns sagen was "klappt nicht" näher erklären? Gibt es einen Compilerfehler? Oder hängt das Programm an irgendeiner Stelle?

Gruß,
Christian
philistion
User
Beiträge: 108
Registriert: Sonntag 7. Februar 2010, 14:16

Freitag 5. März 2010, 10:24

Hast du auch mal den Low-Level-Ansatz versucht?

Code: Alles auswählen

PyThreadState *_save;

_save = PyThreadState_Swap(NULL);
PyEval_ReleaseLock();
//...Do some blocking I/O operation...
PyEval_AcquireLock();
PyThreadState_Swap(_save);
Fängst du Exceptions ab? Wenn ja wie lauten die Fehlermeldungen?
Krauzi
User
Beiträge: 77
Registriert: Montag 22. Oktober 2007, 18:06
Kontaktdaten:

Freitag 5. März 2010, 17:21

da gibts bei mir nen critical error (ohne fehlermeldung) wenn ich die funktion: PyObject_CallObject aufrufe.

EDIT: Ok, anscheinend gibt's unter windows probleme mit dem threading, weil hier öfters ein deadlock auftritt...
Krauzi
User
Beiträge: 77
Registriert: Montag 22. Oktober 2007, 18:06
Kontaktdaten:

Mittwoch 17. März 2010, 18:08

Ah sehr gut es gibt eine saubere Methode die durch die C-API bereit gestellt wird:
PyThread_start_new_thread( [void Funktion], [void *Argument] )
dafür muss die headerdatei pythread.h eingebunden werden.

die Funktion "Funktion" (muss vom typ void sein) wird dann mit dem Argument "Argument" aufgerufen (muss vom typ void * sein).
Ich empfehle ein
"PyGILState_STATE s = PyGILState_Ensure();" am anfang der Funktion "Funktion" sowie ein
"PyGILState_Release(s);" am ende der genannten Funktion.
Threading klappt damit unkompliziert ohne umständliches Interpreter locken.
Leider nicht sehr schnell das ganze, man merkt hier das High-Level interface, jedoch reicht es für z.B. Chat-Programme aus.
Antworten