¿Cómo matar a este threading.Timer?

He lanzado un hilo usando un objeto Timer . Ahora, quiero detener este hilo pero no puedo. He utilizado cancel() , pero no funciona. No se por que

 import threading import time import sys as system def Nop(): print("do nothing") return 0 def function(): try: while True: print("hello world ") time.sleep(2) except KeyboardInterrupt: print( "Good job!! exception catched") t = threading.Timer(10, function) t.start() print(t.getName) counter = 0 while True: try: time.sleep(1) Nop() counter = counter +1 print(counter) if counter == 20: print(t.getName) t.cancel() counter = 0 break if t.is_alive() == False: print("The Timer thread is dead...") except KeyboardInterrupt: print("End of program") t.cancel() system.exit(0) except: print("something wrong happens...") if t.is_alive() == True: print("timer is alive...") print(t.getName) t.cancel() print("final") system.exit(0) 

El hilo debe detenerse cuando el contador es igual a 20, pero aún está vivo. Cuando estoy fuera del bucle while, hay otra comprobación. El temporizador está vivo, es el mismo hilo, trato de cancelar, pero no funciona.

¿Alguna idea?

 do nothing 17 hello world do nothing 18 do nothing 19 hello world do nothing 20 <bound method _Timer.getName of > timer is alive... <bound method _Timer.getName of > final To exit: use 'exit', 'quit', or Ctrl-D. An exception has occurred, use %tb to see the full traceback. SystemExit: 0 hello world hello world hello world hello world 

El problema aquí se puede resolver leyendo la documentación más detenidamente. El método de cancel de un hilo del temporizador “… solo funcionará si el temporizador todavía está en su etapa de espera”.

Cuando usted llama a t.cancel el temporizador se ha t.cancel , y su función asociada se está ejecutando, por lo que ya no está “en su etapa de espera”, aunque la función realmente pasa la mayor parte del tiempo durmiendo, esto NO significa que esté en su Etapa de espera, que termina cuando se dispara el temporizador.

Más generalmente, no hay forma de eliminar un hilo sin su cooperación activa, ya que varias respuestas de SO ya se resumen bien.

En lugar de usar cancel , debe establecer algún tipo de indicador que la function analice para determinar si debe terminar su ciclo (y por lo tanto todo el hilo) o no.

Tratar:

 del threadTimer 

No, esto funcionará o no, pero el método de cancel debería usarse en la etapa de espera. Consulte la documentación para obtener más ayuda. Usted está tratando de usar cancelar el temporizador después de su etapa de espera. Si la sentencia del no funciona, intente esto:

 threadTimer = None 

Esperemos que algo de esto ayude.