Un thread en cours d'exécution peut-il être interrompu brusquement ?
Bien que ce ne soit généralement pas une bonne approche, il est possible de terminer brusquement un thread en cours d'exécution en Python . Cependant, cette approche n'est pas universellement applicable.
Considérations pour une résiliation gracieuse
Considérez les scénarios suivants :
Pour ces cas, il est préférable d'utiliser un indicateur exit_request vérifié régulièrement par le thread cible pour déclencher une sortie si nécessaire.
Exemple de code pour une résiliation gracieuse :
import threading class StoppableThread(threading.Thread): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._stop_event = threading.Event() def stop(self): self._stop_event.set() def stopped(self): return self._stop_event.is_set()
Appelez stop() lorsque le thread doit se terminer, puis join() pour garantir le bon fonctionnement terminaison.
Forcer la terminaison du thread
Dans certains cas, la terminaison forcée du thread peut être nécessaire. Considérez les appels de bibliothèques externes qui introduisent de longs délais.
Lèvement d'exceptions à l'aide de ThreadWithExc
La classe ThreadWithExc permet de déclencher des exceptions dans un thread à partir d'un autre thread :
def _async_raise(tid, exctype): # Raises an Exception (exctype) in thread with ID (tid) if not inspect.isclass(exctype): raise TypeError("Only types can be raised (not instances)") class ThreadWithExc(threading.Thread): def raise_exc(self, exctype): # Raises exctype in the context of the current thread _async_raise(self._get_my_tid(), exctype)
Notez que cette méthode n'est pas fiable si le thread est en dehors de l'interpréteur Python. Assurez-vous que le thread intercepte l'exception spécifique pour effectuer le nettoyage nécessaire.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!