0

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.

Répondre

1

Une idée serait d'avoir un autre thread join le thread principal, puis faire le nettoyage:

def cleanup_on_main_thread_exit(): 
    threading.main_thread().join() 
    do_whatever() 

threading.Thread(target=cleanup_on_main_thread_exit).start() 
+0

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