He visto un montón de preguntas relacionadas con esto ... pero mi código funciona en python 2.6.2 y falla 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 se apaga por una señal? ¿Algo que no debería contar aquí porque capto la señal y luego salgo limpiamente? ¿Que está pasando aqui? ¿Cuál es la forma correcta de hacer esto?python 2.6.x theading/signals/atexit ¿falla en algunas versiones?
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 que nunca se ejecutará las funciones atexit.
He probado el código en Python 2.6.5 y 2.6.1 de Python en OS X 10.6, y se comportan del mismo modo descrito en la pregunta (2.6.5 no ejecutar la atexit mientras hace 2.6.1). Espero que las personas más versadas en el código fuente de Python aconsejen sobre lo que ha cambiado. –
puede haber perdido interés en esto o encontrado una solución, pero todavía estoy interesado en qué cambió entre las dos versiones de Python para desencadenar esto. En lugar de hacer la misma pregunta nuevamente, voy a comenzar una recompensa por esto. Espero que no le importe. –