J'ai vu beaucoup de questions liées à cela ... mais mon code fonctionne sur python 2.6.2 et échoue échoue pour travailler sur python 2.6.5. Est-ce que je me trompe en pensant que l'ensemble des fonctions atexit enregistrées via ce module ne sont pas appelées quand le programme est tué par un signal? Cette chose ne devrait pas compter ici parce que j'attrape le signal et que je quitte proprement? Que se passe t-il ici? Quelle est la bonne façon de faire cela?python 2.6.x theading/signals/atexit échoue sur certaines versions?
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
Le fil principal 2.6.5 semble ne jamais exécuter les fonctions de AtExit.
J'ai essayé le code sur Python 2.6.5 et Python 2.6.1 sous OS X 10.6, et ils se comportent comme décrit dans la question (2.6.5 n'exécutant pas l'atexit alors que 2.6.1 le fait). J'espère que les gens plus versés dans le code source de Python conseilleraient sur ce qui a changé. –
peut avoir perdu l'intérêt pour cela ou trouvé une solution de contournement, mais je suis toujours intéressé par ce qui a changé entre les deux versions de Python pour déclencher cela. Plutôt que de poser à nouveau la même question, je vais commencer une prime là-dessus. J'espère que ça ne le dérange pas. –