threading.Timer para eliminar tareas de larga duración con control de limpieza básico

Me gustaría monitorear un proceso y eliminarlo automáticamente si se ejecuta más de N segundos.

Estoy editando esta pregunta en respuesta a la sugerencia de que es un duplicado de: ¿Hay alguna forma de matar un hilo en Python?

Argumentaría que mi pregunta es ligeramente diferente, ya que estoy enfocado en la limpieza básica DESPUÉS de la finalización del hilo (lo que en realidad podría ser más difícil que el duplicado posible mencionado anteriormente, ya que todos parecen decir que es imposible).

Como una prueba simple, estoy intentando lo siguiente para intentar eliminar el proceso luego de 2 segundos:

import threading import sys import time def after_timeout(): print "KILL THE WORLD HERE!" # whats the secret sauce here (if any)? # sys.exit() and other variants aren't # killing the main thread... is it possible? threading.Timer(2, after_timeout).start() i = 0 while True: print i i += 1 time.sleep(1) 

Entonces … creo que puede haber resuelto esto al combinar 10 publicaciones SO diferentes de una manera que no he visto en ninguna publicación SO única … por favor critique y dígame si esto es tonto o shiny … 😉

[Debido a que esta pregunta está muy relacionada con al menos otras dos … He publicado mi solución propuesta como una respuesta independiente en los dos hilos relacionados: 1 2 ]

 import threading import time import atexit def do_work(): i = 0 @atexit.register def goodbye(): print ("'CLEANLY' kill sub-thread with value: %s [THREAD: %s]" % (i, threading.currentThread().ident)) while True: print i i += 1 time.sleep(1) t = threading.Thread(target=do_work) t.daemon = True t.start() def after_timeout(): print "KILL MAIN THREAD: %s" % threading.currentThread().ident raise SystemExit threading.Timer(2, after_timeout).start() 

Rendimientos:

 0 1 KILL MAIN THREAD: 140013208254208 'CLEANLY' kill sub-thread with value: 2 [THREAD: 140013674317568] 

Creo que esa es la salsa secreta que funcionará para mi aplicación. Mi subproceso ahora se limpia correctamente después de un período de tiempo fijo sin comprobación de señal de bucle sin sentido dentro de dicho subproceso … Y parece que incluso tengo un pequeño rayo de control en el subhilo donde puedo hacer un estado final Comprobación y limpieza.