PyGTK + Threading XXIV

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Hallo zusammen,

ich habe ein größeres Programm, dass verschiedene Threads benötigt. Wie hier im Forum auch immer wieder konstatiert wird: Threads will man sich eigentlich nicht antun. Dummerweise komme ich nicht um sie herum.

Nun ist meine Frage: Wie kann ich Threading in meiner Anwendung so einsetzen, dass auch Plugins ordentlich damit funktionieren? Momentan schwebt mir Folgendes vor:

-> Problem: Plugin soll über mein Interface mit einer REST-API kommunizieren ohne den Prog-Ablauf anzuhalten.
-> Idee: API-Schnittstelle in eigenem Thread mit Queue

Nun gibt es wieder ein Problem: Da das Programm weiterlaufen soll, während die Anfrage bearbeitet wird, bringt es mir nichts, wenn das Plugin oder meine Schnittstelle wartet, bis die Anfrage erledigt wurde. Ein Out-Queue, wie er manchmal vorgeschlagen wird, ist also keine Lösung.

Ich dachte daher daran, dass meine Schnittstelle neben dem eigentlich Query die Angabe eines Callbacks erzwingt. Dieser Callback würde dann aus dem Thread, der die Anfragen bearbeitet - aufgerufen, sobald die Antwort vom REST-Server da ist.
Klares Problem hier: Da der Callback durch einen Thread aufgerufen würde, müsste der Entwickler des Plugins auf Thread-Sicherheit achten. Das ist lästig und soll unter Windows auch nicht so gut funktionieren, wie ich gelesen haben.

Darum habe ich mir gedacht, ich lasse den Callback durch gobject.idle_add() aufrufen. Da der Rückgabewert für diese Funktion "False" sein sollte, müsste ich den Callback aber in eine Funktion einkapseln, die immer "False" zurück liefert. Das ist auch doof, aber besser als die Entwickler zu völlig sinnfreien Rückgabewerten zu zwingen. Wahrscheinlich ginge das ja mit einem schnöden Lambda-Aufruf.

Kann man das so machen? Oder kennt ihr eine andere gute Thread-Architektur? Es wäre halt nötig, dass Plugins leicht mit diesen Threads kommunizieren können, dass es threadsicher ist und dass die Plugins - im Fall der Fälle - auch leicht eigene Threads nutzen können und aus diesen mit der Haupt-Oberfläche interagieren.

brb
Antworten