Heim  >  Artikel  >  Backend-Entwicklung  >  Wie fange ich untergeordnete Thread-Ausnahmen in einem übergeordneten Thread in Python ab?

Wie fange ich untergeordnete Thread-Ausnahmen in einem übergeordneten Thread in Python ab?

Susan Sarandon
Susan SarandonOriginal
2024-11-09 12:06:02143Durchsuche

How to Catch Child Thread Exceptions in a Parent Thread in Python?

Behandeln von Ausnahmen in Multithread-Python-Anwendungen

In Python ermöglicht die Multithread-Programmierung die gleichzeitige Ausführung von Aufgaben. Allerdings kann die Ausnahmebehandlung in Multithread-Kontexten eine Herausforderung darstellen. Dieser Artikel befasst sich mit einem bestimmten Problem: dem Abfangen von Ausnahmen, die in einem untergeordneten Thread vom übergeordneten Thread auftreten.

Das Problem entsteht, weil der untergeordnete Thread unabhängig mit seinem eigenen Kontext und Stapel arbeitet. Im untergeordneten Thread ausgelöste Ausnahmen sind für den übergeordneten Thread nicht sofort sichtbar. Herkömmliche Try-Except-Blöcke im übergeordneten Thread, wie unten gezeigt, funktionieren nicht:

try:
    threadClass.start()   ##### **Exception takes place here**
except:
    print "Caught an exception"

Um dieses Problem zu beheben, können wir die Nachrichtenübermittlung nutzen. Der untergeordnete Thread kann mithilfe einer gemeinsamen Datenstruktur wie einer Warteschlange Ausnahmeinformationen an den übergeordneten Thread senden.

import sys
import threading
import queue

class ExcThread(threading.Thread):

    def __init__(self, bucket):
        threading.Thread.__init__(self)
        self.bucket = bucket

    def run(self):
        try:
            raise Exception('An error occured here.')
        except Exception:
            self.bucket.put(sys.exc_info())

def main():
    bucket = queue.Queue()
    thread_obj = ExcThread(bucket)
    thread_obj.start()

    while True:
        try:
            exc = bucket.get(block=False)
        except queue.Empty:
            pass
        else:
            exc_type, exc_obj, exc_trace = exc
            # deal with the exception
            print exc_type, exc_obj
            print exc_trace

        thread_obj.join(0.1)
        if thread_obj.isAlive():
            continue
        else:
            break

if __name__ == '__main__':
    main()

In diesem Beispiel:

  1. Ein Warteschlangen-Bucket wird erstellt, um Ausnahmen zu teilen Informationen.
  2. Ein ExcThread wird mit einem Verweis auf den Bucket initialisiert.
  3. Der Hauptthread prüft kontinuierlich, ob Ausnahmen in der Warteschlange vorhanden sind.
  4. Wenn eine Ausnahme gefunden wird, wird der Hauptthread angezeigt Thread kann damit angemessen umgehen.

Die Verwendung von Message Passing ermöglicht eine effiziente Kommunikation von Ausnahmen zwischen Threads.

Das obige ist der detaillierte Inhalt vonWie fange ich untergeordnete Thread-Ausnahmen in einem übergeordneten Thread in Python ab?. 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