Danke für diesen Thread - er hat mir auch sehr geholfen.
Ich habe heute etwas über .join () gelernt.
Diese Threads laufen parallel:
d.start()
t.start()
d.join()
t.join()
und diese laufen nacheinander (nicht das, was ich wollte):
d.start()
d.join()
t.start()
t.join()
Insbesondere habe ich versucht, klug und ordentlich zu sein:
class Kiki(threading.Thread):
def __init__(self, time):
super(Kiki, self).__init__()
self.time = time
self.start()
self.join()
Das funktioniert! Aber es läuft nacheinander. Ich kann self.start () in __ init __ einfügen, aber nicht self.join (). Dies muss erfolgen, nachdem jeder Thread gestartet wurde.
join () bewirkt, dass der Hauptthread auf das Ende Ihres Threads wartet. Andernfalls wird Ihr Thread von selbst ausgeführt.
Eine Möglichkeit, sich join () als "Halten" des Hauptthreads vorzustellen, besteht darin, den Thread zu entfädeln und nacheinander im Hauptthread auszuführen, bevor der Hauptthread fortgesetzt werden kann. Es stellt sicher, dass Ihr Thread vollständig ist, bevor sich der Haupt-Thread vorwärts bewegt. Beachten Sie, dass dies in Ordnung ist, wenn Ihr Thread bereits fertig ist, bevor Sie join () aufrufen. Der Hauptthread wird einfach sofort freigegeben, wenn join () aufgerufen wird.
Tatsächlich fällt mir gerade ein, dass der Haupt-Thread bei d.join () wartet, bis Thread d beendet ist, bevor er zu t.join () übergeht.
Um ganz klar zu sein, betrachten Sie diesen Code:
import threading
import time
class Kiki(threading.Thread):
def __init__(self, time):
super(Kiki, self).__init__()
self.time = time
self.start()
def run(self):
print self.time, " seconds start!"
for i in range(0,self.time):
time.sleep(1)
print "1 sec of ", self.time
print self.time, " seconds finished!"
t1 = Kiki(3)
t2 = Kiki(2)
t3 = Kiki(1)
t1.join()
print "t1.join() finished"
t2.join()
print "t2.join() finished"
t3.join()
print "t3.join() finished"
Diese Ausgabe wird erzeugt (beachten Sie, wie die Druckanweisungen ineinander eingefädelt sind.)
$ python test_thread.py
32 seconds start! seconds start!1
seconds start!
1 sec of 1
1 sec of 1 seconds finished!
21 sec of
3
1 sec of 3
1 sec of 2
2 seconds finished!
1 sec of 3
3 seconds finished!
t1.join() finished
t2.join() finished
t3.join() finished
$
Das t1.join () hält den Haupt-Thread hoch. Alle drei Threads werden abgeschlossen, bevor t1.join () beendet wird und der Haupt-Thread fortfährt, um den Druck auszuführen. Dann t2.join (), dann print, dann t3.join () und dann print.
Korrekturen sind willkommen. Ich bin auch neu im Threading.
(Hinweis: Falls Sie interessiert sind, schreibe ich Code für einen DrinkBot und benötige Threading, um die Zutatenpumpen gleichzeitig und nicht nacheinander zu betreiben - weniger Zeit, um auf jedes Getränk zu warten.)