La clase Thread tiene pocas propiedades. Unas de las más útiles son la propiedad name, e ident.
import threading
def Funcion_hilo():
if (threading.current_thread().name == "miHilo7"):
threading.current_thread().name = "nombre-cambiado"
print (f"Hola desde: {threading.current_thread().name} \ ID {threading.current_thread().ident}\n", end="")
#comprobaicón error
#threading.current_thread().ident = 666
hilos = list()
for n in range(1,11):
t = threading.Thread(target=Funcion_hilo, name = "miHilo")
if (n>5):
t.name = "miHilo"+str (n)
hilos.append(t)
t.start()
PS C:\PROGRAMACION\PYTHON\T2.HILOS> c:; cd 'c:\PROGRAMACION\PYTHON\T2.HILOS'; & 'C:\Users\juanj\AppData\Local\Microsoft\WindowsApps\python3.11.exe' 'c:\Users\juanj\.vscode\extensions\ms-python.python-2023.20.0\pythonFiles\lib\python\debugpy\adapter/../..\debugpy\launcher' '57798' '--' 'C:\PROGRAMACION\PYTHON\T2.HILOS\hilo6.py'
Hola desde: miHilo ID 22364
Hola desde: miHilo ID 21428
Hola desde: miHilo ID 2408
Hola desde: miHilo ID 7944
Hola desde: miHilo ID 21064
Hola desde: miHilo6 ID 11588
Hola desde: nombre-cambiado ID 22556
Hola desde: miHilo8 ID 22740
Hola desde: miHilo9 ID 23212
Hola desde: miHilo10 ID 9172
PS C:\PROGRAMACION\PYTHON\T2.HILOS> c:; cd 'c:\PROGRAMACION\PYTHON\T2.HILOS'; & 'C:\Users\juanj\AppData\Local\Microsoft\WindowsApps\python3.11.exe' 'c:\Users\juanj\.vscode\extensions\ms-python.python-2023.20.0\pythonFiles\lib\python\debugpy\adapter/../..\debugpy\launcher' '57816' '--' 'C:\PROGRAMACION\PYTHON\T2.HILOS\hilo6.py'
Hola desde: miHilo ID 8268
Hola desde: miHilo ID 5788
Hola desde: miHilo ID 15128
Hola desde: miHilo ID 11388
Hola desde: miHilo ID 23276
Hola desde: miHilo6 ID 19592
Hola desde: nombre-cambiado ID 23128
Hola desde: miHilo8 ID 7372
Hola desde: miHilo9 ID 20864
Hola desde: miHilo10 ID 23120
PS C:\PROGRAMACION\PYTHON\T2.HILOS>
El ejemplo muestra como establecer el nombre del hilo de las dos formas posibles:
La propiedad se puede cambiar en cualquier momento, incluso cuando se está ejecutando.
Mediante threading.current_thread() accedemos al hilo que se está ejecutando actualmente.
Veamos como acceder a los hilos que están corriendo actualmente:
Descripción: Devuelve el número de hilos activos actualmente en el programa.
Funcionamiento: Esto incluye tanto el hilo principal como cualquier otro hilo en ejecución (ya sea demonio o no demonio). Es útil para monitorear cuántos hilos están trabajando en un momento dado.
Uso común: Se usa para comprobar si se han iniciado todos los hilos necesarios o para asegurarse de que no haya hilos en ejecución después de una tarea.
import threading
import time
def tarea():
time.sleep(1)
# Crear e iniciar varios hilos
hilos = [threading.Thread(target=tarea) for _ in range(5)]
for hilo in hilos:
hilo.start()
print("Número de hilos activos:", threading.active_count()) # Debería mostrar 6: 5 hilos + el hilo principal
import threading
import time
def tarea():
time.sleep(1)
# Crear e iniciar varios hilos
hilos = [threading.Thread(target=tarea) for _ in range(5)]
for hilo in hilos:
hilo.start()
print("Número de hilos activos:", threading.active_count()) # Debería mostrar 6: 5 hilos + el hilo principal
Descripción: Devuelve una lista de todos los objetos de hilo activos en el programa en ese momento.
Funcionamiento: Permite obtener una referencia a cada hilo que está en ejecución, incluyendo el hilo principal y los hilos demonio. Los objetos de hilo en la lista contienen todos sus atributos (nombre, estado, si son demonios, etc.).
Uso común: Es útil para monitorear o realizar un seguimiento específico de ciertos hilos o para obtener información detallada de los hilos en ejecución.
Ejemplo:
import threading
import time
def tarea():
time.sleep(1)
# Crear e iniciar varios hilos
hilos = [threading.Thread(target=tarea, name=f"Hilo-{i}") for i in range(3)]
for hilo in hilos:
hilo.start()
print("Lista de hilos activos:", threading.enumerate())
# Imprime los objetos de hilo con nombres como 'Hilo-0', 'Hilo-1', 'Hilo-2' y el hilo principal
active_count(): Devuelve el número total de hilos activos.
enumerate(): Devuelve una lista de los objetos de hilo activos, que permite analizar los atributos de cada hilo.
Estas funciones son útiles para el monitoreo, depuración y administración de hilos en aplicaciones multihilo en Python.
Ejemplo:
import threading
import time
def tarea():
time.sleep(1)
return
for _ in range(10):
threading.Thread(target=tarea).start()
print ("Hilos activos: ",threading.active_count())
for thread in threading.enumerate():
print(thread.name)
Hilos activos: 11
MainThread
Thread-6 (tarea)
Thread-7 (tarea)
Thread-8 (tarea)
Thread-9 (tarea)
Thread-10 (tarea)
Thread-11 (tarea)
Thread-12 (tarea)
Thread-13 (tarea)
Thread-14 (tarea)
Thread-15 (tarea)
import threading
import time
import logging
import random
import threading
logging.basicConfig(level=logging.DEBUG, format='(%(threadName)-9s) %(message)s',)
def f():
# currentthread() está DEPRECATED
# current_thread() devuelve el objeto Thread que representa al hilo que lo invoca
t = threading.current_thread()
r = random.randint(1, 10)
logging.debug('durmiendo %s segundos', r)
time.sleep(r)
logging.debug('finalizando')
for i in range(3):
t = threading.Thread(target=f)
# deprecated -> t.setDaemon(True)
t.daemon = True
t.start()
main_thread = threading.current_thread()
for t in threading.enumerate():
if t is main_thread:
continue
# deprecated -> logging.debug('esperando %s', t.getName())
logging.debug('esperando %s segundos', t.name)
t.join()
if __name__ == '__main__':
for i in range(3):
t = threading.Thread(target=f)
# deprecated -> t.setDaemon(True)
t.daemon = True
t.start()
main_thread = threading.current_thread()
for t in threading.enumerate():
if t is main_thread:
continue
# deprecated -> logging.debug('esperando %s', t.getName())
logging.debug('esperando %s segundos', t.name)
t.join()
(Thread-6 (f)) durmiendo 3 segundos
(Thread-8 (f)) durmiendo 1 segundos
(MainThread) esperando Thread-6 (f) segundos
(Thread-7 (f)) durmiendo 3 segundos
(Thread-8 (f)) finalizando
(Thread-6 (f)) finalizando
(Thread-7 (f)) finalizando
(MainThread) esperando Thread-7 (f) segundos
(MainThread) esperando Thread-8 (f) segundos
(Thread-9 (f)) durmiendo 2 segundos
(Thread-10 (f)) durmiendo 8 segundos
(MainThread) esperando Thread-9 (f) segundos
(Thread-11 (f)) durmiendo 10 segundos
(Thread-9 (f)) finalizando
(MainThread) esperando Thread-10 (f) segundos
(Thread-10 (f)) finalizando
(MainThread) esperando Thread-11 (f) segundos
(Thread-11 (f)) finalizando