Pemos asociar un hilo a cualquier función y que se ejecute en paralelo, pero podemos encapsularlo en una clase que puede tener sus propios métodos asociados. Esta clase debe derivar de Thread y podemos sobreescribir los métodos: |
__init__()
run()
que será invocado directamente o a través de start()
.Veamos un ejemplo:
import threading
class miHilo(threading.Thread):
def __init__(self, num):
super(miHilo, self).__init__()
self.numero = num
self.nombre = ""
def run(self):
if self.nombre == "hiloPar":
print (f'par: {self.numero}\n',end='')
else:
print (f'impar: {self.numero}\n',end='')
ListaHilos = [] #inicio con la lista vacía
for i in range(4):
t = miHilo(i)
if (i % 2) == 0:
t.nombre = "hiloPar"
else:
t.nombre = "hiloImpar"
ListaHilos.append(t)
for h in ListaHilos:
h.start()
par: 0
impar: 1
par: 2
impar: 3
Aquí podemos ver como la clase miHilo tiene dos propiedades (número y nombre):
Con start() llamamos al método run() en un hilo de control separado.
Ejercicio: Modifica el anterior código para que sea la propia clase quien ponga el nombre al objeto dependiendo del número de creación.
Crea un proyecto …. Tu proyecto debe incluir el fichero README en formato Markdown con el resultado de la ejecución y justificación del funcionamiento.
Ejecuta | Usar sólo en caso de emergencia o una vez hayas resuelto el ejercicio.
Hasta ahora, en el método start(), se establecían los datos con los que sería lanzada la ejecución del hilo. Los datos eran enviados a través de los parámetros args o kkwargs. Al establecer ahora el hilo como una clase, podemos disfrutar de mayor riqueza, pues, además de tener métodos asociados, también podemos tener propiedades, lo cual permite mayor legibilidad del código. En el código siguiente observamos cómo puede cambiar la propiedad del hilo una vez que este ha iniciado la ejecución.
Usaremos la clase Logging, para simplificar la salida de mensajes.
from threading import Thread
import time
import logging
logging.basicConfig( level=logging.DEBUG,format='[%(threadName)-10s]: %(message)s')
class miHilo(Thread):
def __init__(self):
super(miHilo, self).__init__()
self.nombre= ""
def run(self):
for i in range (20):
#print (self.nombre)
logging.debug ("iteración %i, nombre: %s", i+1,self.nombre)
time.sleep (0.1)
t = miHilo()
t.nombre ="Pepe"
t.start()
time.sleep(0.5)
#modificamos un dato posteriormente a inicializarse el hilo
t.nombre ="Lola"
[Thread-1 ]: iteración 1, nombre: Pepe
[Thread-1 ]: iteración 2, nombre: Pepe
[Thread-1 ]: iteración 3, nombre: Pepe
[Thread-1 ]: iteración 4, nombre: Pepe
[Thread-1 ]: iteración 5, nombre: Pepe
[Thread-1 ]: iteración 6, nombre: Lola
[Thread-1 ]: iteración 7, nombre: Lola
[Thread-1 ]: iteración 8, nombre: Lola
[Thread-1 ]: iteración 9, nombre: Lola
[Thread-1 ]: iteración 10, nombre: Lola
[Thread-1 ]: iteración 11, nombre: Lola
[Thread-1 ]: iteración 12, nombre: Lola
[Thread-1 ]: iteración 13, nombre: Lola
[Thread-1 ]: iteración 14, nombre: Lola
[Thread-1 ]: iteración 15, nombre: Lola
[Thread-1 ]: iteración 16, nombre: Lola
[Thread-1 ]: iteración 17, nombre: Lola
[Thread-1 ]: iteración 18, nombre: Lola
[Thread-1 ]: iteración 19, nombre: Lola
[Thread-1 ]: iteración 20, nombre: Lola