nntp2http.com
Posting
Suche
Optionen
Hilfe & Kontakt

Threading: asynchronisierer

Von: Ole Streicher (ole-usenet-spam@gmx.net) [Profil]
Datum: 01.10.2009 16:28
Message-ID: <ytz4oqjchnl.fsf@news.ole.ath.cx>
Newsgroup: de.comp.lang.python
Hallo,

für eine Gui benötige ich eine Möglichkeit,
(wiederholte) Aufrufe zu
verzögern (falls sinnvoll), den eigentlichen Aufruf direkt
zurückkehren
zu lassen und den eigentlichen Aufruf asynchron durchzuführen. Falls der
Ausgangsaufruf mehrfach eintrifft, reicht ein einziger,
zusammengefasster aus.

Das ist z.B. sinnvoll, wenn die Gui viele eintreffende Daten anzeigen
soll, man aber nicht bei jedem Eintreffen ein eigenes Update durchführen
kann.

Nach den (auch hier diskutierten) Versuchen, das ad-hoc in den passenden
Klassen zu implementieren, habe ich es abgespalten:

----------------------8<-------------------------------------------
import threading

class UpdateThread(threading.Thread):
def __init__(self, func):
threading.Thread.__init__(self)
self.setDaemon(True)
self.c = threading.Condition()
self.scheduled = False
self.func = func

def run(self):
while True:
self.c.acquire()
while not self.scheduled:
self.c.wait()
self.scheduled = False
self.c.release()
self.func()

def __call__(self):
self.c.acquire()
self.scheduled = True
self.c.notify()
self.c.release()
----------------------8<-------------------------------------------

Verwendet wird es etwa so:

def do_update():
expensive_gui_change()
...

update = UpdateThread(do_update)

Der Aufruf von update() kehrt nun unmittelbar zurück und wird das
do_update() starten. Wiederholte Aufrufe führen dazu, dass do_update()
erneut ausgeführt wird, aber nur so oft, dass es einmal nach dem letzten
update()-Aufruf ausgeführt wurde.

Zu der Implementierung habe ich jetzt zwei Fragen:

1. Das sieht recht allgemein verwendbar aus, sodass sowas vermutlich
irgendwo schon als Standardroutine existiert. Dann kann ich meinen Code
als Übung betrachten und wegwerfen. Ist das so?

2. Falls nicht: wie bekomme ich es hin, dass der Thread automatisch
beendet und weggeräumt wird, wenn er nicht mehr referenziert wird?

Viele Grüße

Ole

[ Auf dieses Posting antworten ]

Antworten