Спасибо за эту ветку - она мне тоже очень помогла.
Я кое-что узнал о .join () сегодня.
Эти потоки работают параллельно:
d.start()
t.start()
d.join()
t.join()
и они запускаются последовательно (не то, что я хотел):
d.start()
d.join()
t.start()
t.join()
В частности я пытался привести в порядок и привести в порядок
class Kiki(threading.Thread):
def __init__(self, time):
super(Kiki, self).__init__()
self.time = time
self.start()
self.join()
Это работает! Но это работает последовательно. Я могу поместить self.start () в __ init __, но не в self.join (). Это должно быть сделано после каждый поток был запущен.
join () - это то, что заставляет основной поток ждать завершения вашего потока. В противном случае ваш поток запускается сам по себе.
Таким образом, один из способов представить join () как «удержание» в основном потоке - это своего рода удаление потоков из вашего потока и последовательное выполнение в основном потоке, прежде чем основной поток сможет продолжить. Это гарантирует, что ваш поток завершен, прежде чем основной поток продвигается вперед. Обратите внимание, что это означает, что все в порядке, если ваш поток уже завершен до того, как вы вызовете join () - основной поток просто освобождается сразу после вызова join ().
На самом деле, мне только что пришло в голову, что основной поток ожидает d.join (), пока поток d не завершит свою работу, прежде чем перейдет к t.join ().
На самом деле, чтобы быть очень ясным, рассмотрим этот код:
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"
Он производит этот вывод (обратите внимание, как операторы печати встраиваются друг в друга.)
$ 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 () поддерживает основной поток. Все три потока завершаются до того, как завершается t1.join (), и основной поток продолжает выполнение print, затем t2.join (), затем print, затем t3.join (), затем print.
Исправления приветствуются. Я также новичок в потоках.
(Примечание: в случае, если вам интересно, я пишу код для DrinkBot, и мне нужны потоки, чтобы запускать насосы ингредиентов одновременно, а не последовательно - меньше времени для ожидания каждого напитка.)