Merci pour ce fil - cela m'a beaucoup aidé aussi.
J'ai appris quelque chose sur .join () aujourd'hui.
Ces threads s'exécutent en parallèle:
d.start()
t.start()
d.join()
t.join()
et ceux-ci fonctionnent séquentiellement (pas ce que je voulais):
d.start()
d.join()
t.start()
t.join()
En particulier, j'essayais d'intelligent et de bien rangé:
class Kiki(threading.Thread):
def __init__(self, time):
super(Kiki, self).__init__()
self.time = time
self.start()
self.join()
Cela marche! Mais cela fonctionne séquentiellement. Je peux mettre self.start () dans __ init __, mais pas self.join (). Cela doit être fait après le démarrage de chaque thread.
join () est ce qui fait que le thread principal attend la fin de votre thread. Sinon, votre thread s'exécute tout seul.
Donc, une façon de penser à join () comme un "hold" sur le thread principal - il sorte de dé-thread votre thread et s'exécute séquentiellement dans le thread principal, avant que le thread principal puisse continuer. Il garantit que votre thread est terminé avant que le thread principal n'avance. Notez que cela signifie que tout va bien si votre thread est déjà terminé avant d'appeler join () - le thread principal est simplement libéré immédiatement lorsque join () est appelé.
En fait, il me vient juste à l'esprit que le thread principal attend à d.join () jusqu'à ce que le thread d se termine avant de passer à t.join ().
En fait, pour être très clair, considérez ce 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"
Il produit cette sortie (notez comment les instructions d'impression sont enfilées les unes dans les autres.)
$ 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
$
Le t1.join () maintient le thread principal. Les trois threads se terminent avant la fin de t1.join () et le thread principal passe à l'exécution de l'impression, puis de t2.join () puis de l'impression, puis de t3.join (), puis de l'impression.
Les corrections sont les bienvenues. Je suis également nouveau dans le filetage.
(Remarque: au cas où vous seriez intéressé, j'écris du code pour un DrinkBot, et j'ai besoin d'un filetage pour exécuter les pompes à ingrédients simultanément plutôt que séquentiellement - moins de temps à attendre pour chaque boisson.)