kann mal jemand von den Threading Experten kurz in meinen Beispiel-Code schauen?
Das ganze soll eigentlich in einem GUI ablaufen aber ich hab es mal auf das Wesentliche heruntergebrochen:
Ein Thread soll während seiner Laufzeit eine Liste erstellen, diese wird dann zwischendurch abgefragt.
Wenn man nun dieses Script laufen lässt sieht man, dass in der Funktion run_app die Liste self.history abgefragt
wird, die durch den Thread ständig aktualisiert wird.
Jedoch sieht man an dem Output, das beide Listen, die aktuelle im Thread und die durch run_app abgerufene, nicht gleich sind.
Warum ist das so?
Wie kann ich das synchronisieren?
Ist der Ansatz falsch und sollte ich lieber über einen temporären File gehen?
Habt ihr da eine Idee für mich
Vielen Dank
Lutz
Code: Alles auswählen
#!/usr/bin/env python
import time, threading
# ------------------------------------------------------------------------------
class HistThreading(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.history = []
self.running = False
def run(self):
self.running = True
counter = 0
while self.running == True:
counter = counter + 1
print "thread run: ", str(counter)
self.get_history_from_threading()
time.sleep(1)
if counter >= 20:
self.running = False
def get_history_from_threading(self):
self.history.append(int(1))
print "thread get_history: ", len(self.history), self.history
return self.history
# ------------------------------------------------------------------------------
class BaseTest(HistThreading):
def __init__(self):
self.history = []
def any_function(self):
print "base: ", self.history
# ------------------------------------------------------------------------------
class AppTest(BaseTest):
def __init__(self):
self.history = []
self.thread_01 = HistThreading()
self.thread_01.start()
def run_app(self):
i = 0
while i < 10:
i = i + 1
app_history = self.get_history_from_threading()
print "app: ", i, len(app_history), app_history
time.sleep(3)
# ------------------------------------------------------------------------------
if __name__ == "__main__":
a = AppTest()
a.run_app()