c Funktion aus einem eingenen Thread aufrufen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Gast

Hallo!

Wichtige Frage! Bitte helft mir!

Ich möchte eine Funktion meiner in c geschriebenen dll aufrufen. Diese Funktion kehrt jedoch erst zurück wenn ein bestimmtes Event aufgetreten ist! In einem Skript oder der interaktiven Eingabe funktioniert es wunderbar. Jedoch sobald ich diesen Funktionsaufruf in einen eigenen Thread packe stützt Python komplett ab (wenn es die Funktion nicht sofort zukehrt).

Warum ist das so?! Wieso wartet der Thread nicht einfach während alle anderen Thread weiter laufen?!

...ich hoffe ihr könnt mit helfen.
...schon mal vielen Dank für eure Mühe!

Susanne
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Die Python-API ist nicht reentrant. Du mußt ein globales Lock halten damit Du mit dem Interpreter kommunizieren kannst.

Siehe hierzu:

http://docs.python.org/api/threads.html

Andere Baustelle: wenn die C-Funktion in einem eigenen Python-Thread gestartet wird hast Du auch keinen Vorteil, schlicht und ergreifend weil die C-Funktion die GIL (eben dieses globale Lock) freigeben muß damit Python andere Threads ausführt. Das ist an sich kein Problem, bedeutet aber nur dass Du einen ganz dünnen Wrapper um die C-Funktion bauen mußt der eben die GIL für die Teile abgibt die das Python-API nicht brauchen und sich wiederholt wenn das Python-API gebraucht wird.

Wenn diese Erklärung nicht weiterhilft, kann ich gerne mal ein Beispiel schreiben.

--- Heiko.
Gast

Hallo Heiko!

Vielen Dank für die Erklärung! Ich bin jetzt um einiges schlauer.
Ich hab jetzt in meiner c Funktion die folgenden Macros verwendet:

Py_BEGIN_ALLOW_THREADS
Py_END_ALLOW_THREADS

Es scheint tatsächlich zu funktionieren! Hattest du es so gemeint?!

Zusatzfrage: Dann ist es doch sinnvoll in allen c Funktionen, für die zeit in der keine Python-API gebraucht wird das globale Lock freizugeben oder?!

danke, gruß
susanne
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Ja, ich hatte es so gemeint, und ja, es ist sinnvoll das GIL freizugeben wenn kein Objekt geändert wird wo man mit Python rankommt.

Das kann zum einen bedeuten dass kein Python-API gebraucht wird, das kann aber auch zum anderen bedeuten dass man eben kein Datum verändert wo ein Python-Objekt irgendwie rankommt. Letzteres hat man häufig in Extension-Types, also zum Beispiel darf ich in einer Routine die inplace irgendetwas mit den C-Daten meines Objekts ändert nicht die GIL freigeben, weil mein Objekt möglicherweise in einem anderen Thread auch gebunden ist und von dort aus auch eine Funktion meines Objekts aufgerufen wird. Ich darf das natürlich schon tun (das killt den Interpreter nicht, aber vielleicht meinen Typ) aber im Endeffekt sind das aber die normalen Synchronizitätsgeschichten und haben nicht mehr direkt was mit der GIL zu tun.

--- Heiko.
Gast

...ja genau so hab ich mir das auch schon gedacht!
nochmals super vielen DANK für die Hilfe!

susanne
Antworten