GUI-Programmierung mit Python

11/08/2009 - 18:44 von Ole Streicher | Report spam
Hallo Gruppe,

ich möchte ein "klein wenig" GUI-Programmierung mit Python machen. Dabei
stellt sich für mich ein Problem: dass man (C)Python praktisch nicht
multi-threaded verwenden kann.

Wenn ich in meinem Programm eine langwierige Rechnung/IO-Zugriff
durchführe, ist damit bei naiver Programmierung die Oberflàche
blockiert, bis die Operation abgeschlossen ist, was natürlich gegen jede
Konvention verstößt.

Normalerweise würde ich solche Operationen einfach in einen neuen Thread
auslagern, sodass die Funktionalitàt der Oberflàche auch wàhrend der
Operation erhalten bleibt. Unter Java sàhe das etwa so aus (ohne
Fehlerbehandlung u.à.):

(new Thread() {
public void run() {
MyResult res = mach_eine_ganz_lange_Rechnung(myInput);
display_result(res);
}
}).start()

Wenn ich das gleiche in (C)Python versuche, dann legt mir der GIL die
Oberflàche lahm, bis die Rechnung fertig ist. Wie làsst sich das
sinnvoll vermeiden?

Viele Grüße

Ole
 

Lesen sie die antworten

#1 Dietmar Schwertberger
11/08/2009 - 19:18 | Warnen spam
Hallo Ole!


Ole Streicher schrieb:
ich möchte ein "klein wenig" GUI-Programmierung mit Python machen. Dabei
stellt sich für mich ein Problem: dass man (C)Python praktisch nicht
multi-threaded verwenden kann.


Was möchtest du konkret machen, daß du zu diesem Schluss kommst?
Mehrere Cores kannst du mit den Standard-Threads nicht auslasten,
aber dafür gibt's ggfs. das multiprocessing-Modul.
Mit den Standard-Threads reagiert die Oberflàche halt etwas langsamer,
aber wahrscheinlich merkst du's nicht.


Wenn ich in meinem Programm eine langwierige Rechnung/IO-Zugriff
durchführe, ist damit bei naiver Programmierung die Oberflàche
blockiert, bis die Operation abgeschlossen ist, was natürlich gegen jede
Konvention verstößt.

Normalerweise würde ich solche Operationen einfach in einen neuen Thread
auslagern, sodass die Funktionalitàt der Oberflàche auch wàhrend der
Operation erhalten bleibt. Unter Java sàhe das etwa so aus (ohne

Wenn ich das gleiche in (C)Python versuche, dann legt mir der GIL die
Oberflàche lahm, bis die Rechnung fertig ist. Wie làsst sich das
sinnvoll vermeiden?



Auslagern einer làngeren Aktion in einen eigenen Thread ist auch in
Python möglich.
Die GUI wird dann aktualisiert, indem Events zurück zum Main-Thread
geschickt werden
(oder der Main-Thread für das Ergebnis pollt).

Für wxPython findest du hier ein paar Beispiele:
http://wiki.wxpython.org/LongRunningTasks


Gruß,

Dietmar

Ähnliche fragen