Mediante la calse Timer
podemos invocar la ejecución de un hilo, con un retraso en el tiempo de inicio de ejecución expresado en segundos.
En el momento de crear el timer, además del tiempo de retardo y la función objetivo, podemos indicar los parámetros args y kwargs para enviar datos, de la misma forma en que lo hacemos con un thread convencional. Los dos métodos que implementa un timer son:
start()
, el cual inicializa el Timer con el retardo establecido en el momento de su creación.
cancel()
, que permite la terminación del hilo únicamente si este está en el tiempo de postergación y, por lo tanto, no ha comenzado.
Podemos ver como funciona la asociación de un hilo tipo Timer a la función tarea(num)
. Hemos establecido un retraso de tres segundos para su ejecución, para que podamos observar que, si el método cancel() lo lanzamos cuando ya se ha iniciado (5 seg. en este caso), ya no es posible pararlo. Podríamos aumentar el retraso de 3 a 8 seg., por ejemplo, y ver que en este caso sí responde a la petición de cancelación, dado que todavía no arrancó.
import threading
import time
def tarea(num):
for _ in range (num):
print("Ejecutando tarea...")
time.sleep(1)
#print (threading.currentThread().name)
veces = 10
t = threading.Timer(3, tarea, [veces,])
print("Iniciando hilo con temporizador")
t.start() #será ejecutado tras tres segundos
time.sleep(5)
#prueba para cancelar el hilo
print("Cancelando la tarea <<si no se ha comenzado>>")
t.cancel()
Ejecución:
Iniciando hilo con temporizador Ejecutando tarea... Ejecutando tarea... Cancelando la tarea si no se ha comenzado Ejecutando tarea... Ejecutando tarea... Ejecutando tarea... Ejecutando tarea... Ejecutando tarea... Ejecutando tarea... Ejecutando tarea... Ejecutando tarea...