Bien qu'il soit généralement préférable de demander aux fils de se terminer correctement, il existe des situations où une résiliation brutale est nécessaire . Cet article explore les méthodes permettant de mettre fin aux threads même lorsqu'ils ne sont pas conçus pour cela.
L'approche recommandée consiste à utiliser un indicateur d'arrêt que les threads vérifient périodiquement pour déterminer s'ils doivent se terminer. . Cela permet aux threads de libérer des ressources et d'effectuer un nettoyage avant de se terminer.
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()
Dans de rares cas, il peut être nécessaire de mettre fin de force à un thread. Ceci peut être réalisé en utilisant la fonction _async_raise :
def _async_raise(tid, exctype): if not inspect.isclass(exctype): raise TypeError("Only types can be raised (not instances)") res = ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(tid), ctypes.py_object(exctype)) if res == 0: raise ValueError("invalid thread id") elif res != 1: ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(tid), None) raise SystemError("PyThreadState_SetAsyncExc failed") class ThreadWithExc(threading.Thread): def raise_exc(self, exctype): _async_raise(self._get_my_tid(), exctype)
Notez que la résiliation forcée peut laisser les ressources dans un état instable. Utilisez cette option uniquement lorsque la résiliation gracieuse n'est pas disponible ou lorsque le thread bloque activement le programme.
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!