Heim >Backend-Entwicklung >Python-Tutorial >Wie kann ich einen laufenden Thread in Python ordnungsgemäß und gewaltsam beenden?

Wie kann ich einen laufenden Thread in Python ordnungsgemäß und gewaltsam beenden?

Linda Hamilton
Linda HamiltonOriginal
2024-12-25 15:32:24858Durchsuche

How Can I Gracefully and Forcefully Terminate a Running Thread in Python?

Möglichkeiten zum Beenden eines laufenden Threads

Hintergrund

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.

Anmutige Beendigung

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()

Erzwungene Beendigung

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)

Vorbehalte

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn