Während es im Allgemeinen vorzuziehen ist, Threads zum ordnungsgemäßen Beenden aufzufordern, gibt es Situationen, in denen ein abruptes Beenden erforderlich ist . In diesem Artikel werden Methoden zum Beenden von Threads untersucht, auch wenn sie möglicherweise nicht dafür ausgelegt sind.
Der empfohlene Ansatz ist die Verwendung eines Stopp-Flags, das Threads regelmäßig überprüfen, um festzustellen, ob sie beendet werden sollen . Dadurch können Threads Ressourcen freigeben und eine Bereinigung durchführen, bevor sie beendet werden.
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()
In seltenen Fällen kann es notwendig sein, einen Thread zwangsweise zu beenden. Dies kann mit der Funktion _async_raise erreicht werden:
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)
Beachten Sie, dass eine erzwungene Beendigung dazu führen kann, dass Ressourcen in einem instabilen Zustand bleiben. Verwenden Sie diese Option nur, wenn eine ordnungsgemäße Beendigung nicht verfügbar ist oder wenn der Thread das Programm aktiv blockiert.
Das obige ist der detaillierte Inhalt vonWie kann ich einen laufenden Thread in Python ordnungsgemäß und gewaltsam beenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!