Дякую за цю тему - мені це теж дуже допомогло.
Я дізнався щось про .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 (), і основний потік рухається, щоб виконати друк, потім t2.join (), потім надрукувати, потім t3.join (), потім надрукувати.
Виправлення вітаються. Я також новачок у різьбі.
(Примітка: якщо вам це цікаво, я пишу код для DrinkBot, і мені потрібна нарізка для запуску насосів з інгредієнтами одночасно, а не послідовно - менше часу на очікування кожного напою.)