Gracias por este hilo, también me ayudó mucho.
Hoy aprendí algo sobre .join ().
Estos hilos se ejecutan en paralelo:
d.start()
t.start()
d.join()
t.join()
y estos se ejecutan secuencialmente (no es lo que quería):
d.start()
d.join()
t.start()
t.join()
En particular, estaba tratando de ser inteligente y ordenado:
class Kiki(threading.Thread):
def __init__(self, time):
super(Kiki, self).__init__()
self.time = time
self.start()
self.join()
¡Esto funciona! Pero se ejecuta secuencialmente. Puedo poner self.start () en __ init __, pero no self.join (). Eso debe hacerse después de que se haya iniciado cada hilo.
join () es lo que hace que el hilo principal espere a que termine su hilo. De lo contrario, su hilo se ejecuta por sí solo.
Por lo tanto, una forma de pensar en join () como una "retención" en el hilo principal: deshilacha el hilo y se ejecuta secuencialmente en el hilo principal, antes de que el hilo principal pueda continuar. Asegura que su hilo esté completo antes de que el hilo principal avance. Tenga en cuenta que esto significa que está bien si su hilo ya está terminado antes de llamar a join (): el hilo principal simplemente se libera inmediatamente cuando se llama a join ().
De hecho, justo ahora se me ocurre que el hilo principal espera en d.join () hasta que el hilo d finalice antes de pasar a t.join ().
De hecho, para ser muy claro, considere este código:
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"
Produce esta salida (tenga en cuenta cómo se enhebran las declaraciones de impresión entre sí).
$ 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
$
El t1.join () está sosteniendo el hilo principal. Los tres subprocesos se completan antes de que t1.join () termine y el subproceso principal se mueve para ejecutar la impresión, luego t2.join () luego imprime y luego t3.join () luego imprime.
Correcciones de bienvenida. También soy nuevo en el enhebrado.
(Nota: en caso de que le interese, estoy escribiendo un código para un DrinkBot, y necesito enhebrar para ejecutar las bombas de ingredientes de forma simultánea en lugar de secuencial, menos tiempo para esperar cada bebida).