Maison >développement back-end >Tutoriel Python >Comment tuer gracieusement et de force un fil de discussion en Python ?
En Python, l'arrêt d'un fil de discussion est généralement déconseillé en raison de problèmes potentiels de ressources. Cependant, il existe des cas où une terminaison forcée est nécessaire.
La meilleure pratique consiste à définir un indicateur de sortie que les threads vérifient périodiquement, permettant une sortie en douceur. Par exemple, l'utilisation d'une classe StoppableThread avec un indicateur exit_request permet aux threads de vérifier la terminaison et de se terminer en conséquence.
class StoppableThread(threading.Thread): def __init__(self, *args, **kwargs): super(StoppableThread, self).__init__(*args, **kwargs) self._stop_event = threading.Event() def stop(self): self._stop_event.set() def stopped(self): return self._stop_event.is_set()
Dans les cas extrêmes, terminaison directe du thread est nécessaire. Cependant, cette approche comporte des risques si le thread contient des ressources critiques.
Une méthode consiste à déclencher une exception dans le thread à l'aide de la fonction _async_raise. Cela déclenche une exception de manière asynchrone, permettant au thread de l'attraper et de la gérer avec élégance.
def _async_raise(tid, exctype): res = ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(tid), ctypes.py_object(exctype)) ... class ThreadWithExc(threading.Thread): def raise_exc(self, exctype): _async_raise(self._get_my_tid(), exctype )
La suppression abrupte des threads peut entraîner des fuites de ressources ou une exécution incomplète des tâches. Il est donc essentiel d’employer judicieusement l’approche de résiliation forcée et de toujours privilégier les sorties en douceur. De plus, la méthode _async_raise peut ne pas toujours être efficace si le thread effectue des opérations intensives.
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!