La diferencia y el uso de join y setDaemon en subprocesos en Python
Los métodos join() y setDaemon() se utilizan a menudo en la programación multiproceso de Python. El uso básico es el siguiente:
join([time]): espere hasta que finalice. El hilo termina. Esto bloquea el hilo que llama hasta que el método join() del hilo se llama abortar (salir normalmente o generar una excepción no controlada) o se produce un tiempo de espera opcional.
setDaemon, marca el hilo como un hilo de demonio o hilo de usuario
1. Método join (): en el hilo principal A, se crea el subproceso B y en el hilo principal A. Si se llama a B.join(), entonces el hilo principal A esperará en el lugar de llamada hasta que el subproceso B complete la operación antes de poder continuar ejecutándose. Luego, al llamar a este hilo, puede usar el método de unión del. llamado hilo.
Prototipo: join([timeout]), los parámetros internos son opcionales y representan el tiempo máximo para que se ejecute el hilo, es decir, si se excede este tiempo, el hilo se reciclará independientemente de si. ha completado la ejecución y luego El hilo o función principal se ejecutará a continuación.
importar subprocesosimportar clase de tiempo MyThread(threading.Thread): def __init__(self, id): threading.Thread.__init__(self) self.id = id def run(self): x = 0 tiempo. dormir(10) print(self.id) print('Hilo finalizado:'+str(time.time())) if __name__ == "__main__": t1 = MiHilo(999) print('Hilo iniciado:'+str (time.time())) t1.start() print('Comienza la impresión del hilo principal:'+str(time.time())) para i en el rango(5): print(i) time.sleep(2) print('Finaliza la impresión del hilo principal:' + str(time.time()))
Inicio del hilo: 1497534590.2784667
Comienza la impresión del hilo principal: 1497534590.2794669
1
2
3
4
Extremos de impresión del hilo principal: 1497534592.279581
999
Subproceso finalizado: 1497534600.2800388
De los resultados de la impresión, podemos ver que después de que se inició el subproceso t1, el subproceso principal no esperó a que el subproceso t1 terminara de ejecutarse antes de ejecutarlo. En lugar de ello, ejecutó lo siguiente. declaraciones mientras el hilo se estaba ejecutando.
Ahora, agregue el método join() después del hilo inicial (el resto del código permanece sin cambios)
import threadingimport time class MyThread(threading.Thread): def __init__(self, id) : threading.Thread.__init__(self) self.id = id def run(self): x = 0 time.sleep(10) print(self.id) print('Hilo finalizado: '+str(time.time() )) if __name__ == "__main__": t1 = MyThread(999) print('Inicio del hilo:'+str(time.time())) t1.start() t1.join() print('Comienza la impresión del hilo principal :'+str(time.time())) para i en el rango(5): print(i) time.sleep(2) print('Fin de la impresión del hilo principal:' + str(time.time()))
Inicio de hilo: 1497535176.5019968
999
Fin de hilo: 1497535186.5025687
Inicio de impresión de hilo principal: 1497535186.5025687
1
2
3
4
El hilo principal imprime: 1497535188.5026832
Después de que comienza el hilo t1, el hilo principal El hilo se detiene en el método join() Después de que finaliza el subproceso t1, el hilo principal continúa ejecutando las declaraciones después de unirse.
2.Método setDaemon(). En el hilo principal A, se crea el subproceso B y se llama a B.setDaemon () en el hilo principal A. Esto significa que el hilo principal A se configura como un hilo demonio En este momento, si finaliza la ejecución del hilo principal A. , Independientemente de si se completa el subproceso B, saldrá con el hilo principal A. Este es el significado del método setDaemon, que es básicamente lo opuesto a unirse. Además, hay algo especial a tener en cuenta: debe configurarse antes de llamar al método start().
importar subprocesos
importar clase de tiempo MyThread(threading.Thread): def __init__(self, id): threading.Thread.__init__(self) self.id = id def run(self): x = 0 tiempo .sleep(10) print(self.id) print("Esto es: " + self.getName()) # Obtener el nombre del hilo print('Hilo finalizado: ' + str(time.time())) if __name__ = = "__main__": t1 = MyThread(999) print('El hilo comienza:'+str(time.time())) t1.setDaemon(True) t1.start() print('La impresión del hilo principal comienza:'+str ( time.time())) para i en rango(5): print(i) time.sleep(2) print('Fin de la impresión del hilo principal:' + str(time.time()))
Inicio de hilo: 1497536678.8509264
Inicio de impresión de hilo principal: 1497536678.8509264
1
2
3
4
El hilo principal imprime: 1497536680.8510408
La operación de t1.setDaemon(True) establece el hilo secundario como un hilo de demonio. Según el significado del método setDaemon (), el hilo principal finaliza después de imprimir el contenido, independientemente de si el hilo secundario ha completado la ejecución.
Si no se agrega t1.setDaemon(True) antes de iniciar el hilo, el resultado de salida es:
Inicio del hilo: 1497536865.3215919
Inicio de impresión del hilo principal: 1497536865.3215919
1
2
3
4
Extremos de impresión del hilo principal: 1497536867.3217063
999
Esto es: Hilo-1
Fin del hilo: 1497536875.3221638
Mientras el programa se ejecuta, se ejecuta un hilo principal si es el principal. El subproceso crea un subproceso secundario, el subproceso principal y el subproceso se dividen en dos formas y se ejecutan por separado. Luego, cuando el subproceso principal se completa y quiere salir, verificará si el subproceso está completo. no se completa, el hilo principal esperará a que se complete el hilo secundario antes de salir;
A veces lo que necesitamos es continuar ejecutando el hilo principal después de que el hilo secundario haya terminado de ejecutarse. puede usar el método de unión (después de que se inicia el subproceso);
Pero a veces lo que necesitamos es que, siempre que cuando se complete el subproceso principal, independientemente de si el subproceso esté completo, debe salir junto con el hilo principal. En este momento, se puede utilizar el método setDaemon (antes de que se inicie el hilo).