Python 2.6.x theading / señales / atexit falla en algunas versiones?
He visto muchas preguntas relacionadas con esto ... pero mi códigotrabajos en python 2.6.2 yfalla para trabajar en python 2.6.5. ¿Me equivoco al pensar que todas las funciones de atexit "registradas a través de este módulo no se invocan cuando el programa es eliminado por una señal", la cosa no debería contar aquí porque estoy captando la señal y luego salgo limpiamente? ¿Que está pasando aqui? ¿Cuál es la forma correcta de hacer esto?
import atexit, sys, signal, time, threading
terminate = False
threads = []
def test_loop():
while True:
if terminate:
print('stopping thread')
break
else:
print('looping')
time.sleep(1)
@atexit.register
def shutdown():
global terminate
print('shutdown detected')
terminate = True
for thread in threads:
thread.join()
def close_handler(signum, frame):
print('caught signal')
sys.exit(0)
def run():
global threads
thread = threading.Thread(target=test_loop)
thread.start()
threads.append(thread)
while True:
time.sleep(2)
print('main')
signal.signal(signal.SIGINT, close_handler)
if __name__ == "__main__":
run()
Python 2.6.2:
$ python halp.py
looping
looping
looping
main
looping
main
looping
looping
looping
main
looping
^Ccaught signal
shutdown detected
stopping thread
Python 2.6.5:
$ python halp.py
looping
looping
looping
main
looping
looping
main
looping
looping
main
^Ccaught signal
looping
looping
looping
looping
...
looping
looping
Killed <- kill -9 process at this point
El hilo principal en 2.6.5 parece no ejecutar nunca las funciones atexit.