Dzięki za ten wątek - bardzo mi też pomógł.
Nauczyłem się dziś czegoś o .join ().
Te wątki działają równolegle:
d.start()
t.start()
d.join()
t.join()
a te działają sekwencyjnie (nie to, co chciałem):
d.start()
d.join()
t.start()
t.join()
W szczególności starałem się sprytnie i uporządkować:
class Kiki(threading.Thread):
def __init__(self, time):
super(Kiki, self).__init__()
self.time = time
self.start()
self.join()
To działa! Ale działa sekwencyjnie. Mogę umieścić self.start () w __ init __, ale nie self.join (). Należy to zrobić po rozpoczęciu każdego wątku.
join () powoduje, że główny wątek czeka na zakończenie wątku. W przeciwnym razie wątek działa sam.
Tak więc jednym ze sposobów myślenia o złączeniu () jako „wstrzymaniu” głównego wątku - jest to rodzaj usuwania wątków z wątku i wykonywania sekwencyjnego w głównym wątku, zanim główny wątek będzie mógł kontynuować. Zapewnia, że Twój wątek jest kompletny, zanim główny wątek przejdzie do przodu. Zauważ, że oznacza to, że nic nie szkodzi, jeśli Twój wątek jest już zakończony przed wywołaniem funkcji join () - główny wątek jest po prostu zwalniany natychmiast po wywołaniu funkcji join ().
W rzeczywistości właśnie teraz przychodzi mi do głowy, że główny wątek czeka w d.join (), aż wątek d zakończy się, zanim przejdzie do t.join ().
W rzeczywistości, aby być bardzo jasnym, rozważ ten kod:
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"
Tworzy to wyjście (zwróć uwagę, w jaki sposób instrukcje drukowania są ze sobą powiązane.)
$ 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 () utrzymuje główny wątek. Wszystkie trzy wątki zakończą się przed zakończeniem t1.join (), a główny wątek przejdzie do wykonania drukowania, następnie t2.join (), następnie wydrukuj następnie t3.join (), a następnie wydrukuj.
Korekty mile widziane. Jestem również nowy w wątkach.
(Uwaga: jeśli jesteś zainteresowany, piszę kod dla DrinkBota i potrzebuję wątków, aby uruchomić pompy składników jednocześnie, a nie sekwencyjnie - mniej czasu na czekanie na każdego drinka.)