Grazie per questa discussione - mi ha aiutato molto.
Oggi ho imparato qualcosa su .join ().
Questi thread funzionano in parallelo:
d.start()
t.start()
d.join()
t.join()
e questi funzionano in sequenza (non quello che volevo):
d.start()
d.join()
t.start()
t.join()
In particolare, stavo cercando di fare in modo intelligente e ordinato:
class Kiki(threading.Thread):
def __init__(self, time):
super(Kiki, self).__init__()
self.time = time
self.start()
self.join()
Questo funziona! Ma funziona in sequenza. Posso mettere self.start () in __ init __, ma non self.join (). Questo deve essere fatto dopo che ogni thread è stato avviato.
join () è ciò che fa sì che il thread principale attenda il termine del thread. Altrimenti, il tuo thread viene eseguito da solo.
Quindi un modo per pensare a join () come una "trattenuta" sul thread principale: in qualche modo de-thread il thread e viene eseguito in sequenza nel thread principale, prima che il thread principale possa continuare. Assicura che il thread sia completo prima che il thread principale si sposti in avanti. Nota che questo significa che va bene se il tuo thread è già finito prima di chiamare il join () - il thread principale viene semplicemente rilasciato immediatamente quando viene chiamato join ().
In effetti, mi viene subito in mente che il thread principale attende d.join () fino a quando il thread d non termina prima di passare a t.join ().
In effetti, per essere molto chiari, considera questo codice:
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"
Produce questo output (notare come le istruzioni di stampa sono intrecciate l'una nell'altra).
$ 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
$
T1.join () sta sostenendo il thread principale. Tutti e tre i thread vengono completati prima che t1.join () termini e il thread principale si sposta per eseguire la stampa, quindi t2.join (), quindi stampa, quindi t3.join (), quindi stampa.
Correzioni benvenute. Sono anche nuovo al threading.
(Nota: nel caso tu sia interessato, sto scrivendo il codice per un DrinkBot e ho bisogno del threading per eseguire contemporaneamente le pompe degli ingredienti piuttosto che in sequenza - meno tempo di attesa per ogni bevanda.)