GUI friert ein, wenn bei gleichzeitiger SSH-Verbindung

Plattformunabhängige GUIs mit wxWidgets.
Antworten
bankkind
User
Beiträge: 106
Registriert: Freitag 14. September 2007, 23:02
Wohnort: Teltow
Kontaktdaten:

Ich will ein Tool mit dem ich SSH-public-Keys auf verschiedene Server verteile via wxpython etwas hübscher machen. Das hat auch soweit geklappt, aber es ist so, dass nach einer bestimmten Anzahl an Connections die GUI einfach einfriert. Die Keys werden zwar weiterhin verteilt, aber in der GUI wird mir das nicht mehr angezeigt.

Zur Funktionsweise:
ich habe eine Liste von Hosts (zur Zeit etwas über 400). Die einzelnen Hosts werden via Schleife abgeklappert und es wird getestet ob eine ANmeldung via Key-Auth funktioniert, wenn nicht, dann wird der entsprechende public-Key auf dem Zielserver platziert. Das habe ich jahrelang via Kommandozeilen-Tool gemacht. Nun wollte ich das Tool erweitern um eine GUI und habe mich für wxpython entschieden. Das Tool funktioniert genausogut wie vorher nur friert die GUI nach dem 5. oder 6. geprüftem Zielsystem ein. (Im Hintergrund werden weiterhin die Hosts geprüft und ggf. Keys verteilt)
Ich dachte erst das es an einem multiline TextCtrl liegt, welches ich nach jedem System via appendText aktualisiere. Aber selbst wenn ich das wegnehme friert die GUI ein.
Nach durchlaufen alle Zielsysteme wird das TextCtrl schlagartig gefüllt.

Gibt es einen Trick wie ich die GUI vom Rest so entkoppeln kann, dass die GUI weiterhin benutzbar bleibt? Oder ist wxpython hierfür das falsche Produkt?
BlackJack

@bankkind: GUIs funktionieren ereignisorientiert. Wenn die GUI-Hauptschleife läuft, dann wird die GUI aktualisiert und Benutzeraktionen werden erkannt und behandelt, und wenn sie das nicht tut, dann ist die GUI tot. Deshalb darf man nur kurz laufende Codestücke als Rückruffunktionen verwenden. Längerlaufendes muss man entweder in Schritte aufteilen die von der GUI-Hauptschleife nacheinander angestossen werden und zwischendurch immer wieder die Kontrolle an die GUI-Hauptschleife zurückgeben, oder man muss mit Threads arbeiten. Dann muss man aber beachten das GUI-Rahmenwerke in der Regel nicht thread-sicher sind, oder nur an ganz bestimmten stellen, was bedeutet, dass man die GUI nicht aus einem anderen Thread verändern darf als dem in dem die GUI-Hauptschleife läuft. Die drei threadsicheren Funktione bei `wx` sind `wx.PostEvent()`, `wx.CallAfter()`, und `wx.CallLater()`.
bankkind
User
Beiträge: 106
Registriert: Freitag 14. September 2007, 23:02
Wohnort: Teltow
Kontaktdaten:

Hallo BlackJack,
vielen Dank. Ich konnte das Problem nun lösen indem ich die SSH-Verbindungen in eigene Threads ausgelagert habe. Um nicht 400 Threads gleichzeitig zu starten habe ich mir einen kleinen Threadmanager geschrieben der das (hoffentlich) sauber verwaltet.
BlackJack

@bankkind: Erfinde das Rad nicht neu wenn Du nicht musst. Verwende `concurrent.futures` oder `multiprocessing.dummy.Pool` (das `dummy`-Modul ist die `multiprocessing`-API mit Threads).
Antworten