Merci pour ce fil de discussion - il m'a beaucoup aidé aussi.
J'ai appris quelque chose sur .join() aujourd'hui.
Ces fils fonctionnent en parallèle :
d.start()
t.start()
d.join()
t.join()
et ceux-ci s'exécutent de manière séquentielle (ce qui n'est pas ce que je voulais) :
d.start()
d.join()
t.start()
t.join()
En particulier, j'essayais d'être astucieux et ordonné :
class Kiki(threading.Thread):
def __init__(self, time):
super(Kiki, self).__init__()
self.time = time
self.start()
self.join()
Cela fonctionne ! Mais il s'exécute de manière séquentielle. Je peux mettre le self.start() dans __ init __, mais pas le self.join(). Cela doit être fait après tous les sujets ont été abordés.
join() est ce qui fait que le thread principal attend que votre thread se termine. Dans le cas contraire, votre thread s'exécute tout seul.
On peut donc considérer join() comme un "hold" sur le fil d'exécution principal - il désenchevêtre en quelque sorte votre fil d'exécution et s'exécute séquentiellement dans le fil d'exécution principal, avant que celui-ci ne puisse continuer. Il s'assure que votre thread est complet avant que le thread principal n'avance. Notez que cela signifie qu'il n'y a pas de problème si votre thread est déjà terminé avant que vous appeliez join() -- le thread principal est simplement libéré immédiatement lorsque join() est appelé.
En fait, je viens de me rendre compte que le fil principal attend que le fil d.join() 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 imbriqué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() retarde le fil principal. Les trois threads se terminent avant que t1.join() ne se termine et le thread principal passe à l'exécution de print puis t2.join() puis print puis t3.join() puis print.
Les corrections sont les bienvenues. Je suis également novice en matière d'enfilage.
(Note : au cas où cela vous intéresserait, j'écris du code pour un DrinkBot, et j'ai besoin de threading pour faire fonctionner les pompes à ingrédients simultanément plutôt que séquentiellement -- moins de temps à attendre pour chaque boisson).