Existe-t-il un moyen d'exécuter une fonction lorsque le thread principal d'un processus python est arrêté (normalement ou avec une exception non interceptée)?Comment puis-je finaliser le thread principal?
J'espérais atexit.register
fournirait cette fonctionnalité, mais apparemment il ne soit pas Invoqué lorsque le thread principal a pris fin - que lorsque toutes les discussions ont pris fin. Donc, ce code ne fonctionne pas comme prévu:
import atexit
import threading
done = False
def stop_child_thread():
global done
done = True
def child_thread():
while not done:
pass
atexit.register(stop_child_thread)
t = threading.Thread(target=child_thread)
t.start()
Je ne veux pas commencer le fil de l'enfant comme un thread démon parce que je veux qu'il ait une chance de nettoyer après lui-même avant qu'il ne soit mis fin. La seule solution à laquelle je puisse penser maintenant est de vérifier périodiquement (à partir du thread fils ou d'un thread dédié) si le thread principal est toujours actif, et sinon, exécutez la fonction dont j'ai besoin.
Thx, cela semble fonctionner dans la configuration simple que je l'ai montré dans ma question - il vaut mieux que le vote Je prévoyais d'utiliser. Malheureusement, d'une manière ou d'une autre dans le code actuel, il en résulte un léger problème: l'interpréteur python semble rester en vie malgré tous les threads qui se terminent avec succès; il est facilement arrêté par CTRL-C. Je ne suis pas sûr de ce qui se passe, et je ne peux pas le reprocher avec un petit exemple; peut-être que le mécanisme de sortie de l'interpréteur python est confus. – max