Heim > Backend-Entwicklung > Python-Tutorial > Wie fängt man Ausnahmen von einem untergeordneten Thread im Hauptthread ab?

Wie fängt man Ausnahmen von einem untergeordneten Thread im Hauptthread ab?

Mary-Kate Olsen
Freigeben: 2024-11-09 01:26:02
Original
371 Leute haben es durchsucht

How to Catch Exceptions from a Child Thread in the Main Thread?

Ausnahmen von einem untergeordneten Thread im Hauptthread abfangen

Bei der Arbeit mit Multithread-Programmierung ist es wichtig, Ausnahmen angemessen zu behandeln. Im Fall von Python tritt ein häufiges Problem auf, wenn versucht wird, Ausnahmen abzufangen, die in einem untergeordneten Thread im Hauptthread ausgelöst werden.

Verstehen des Problems

Der Code lieferte Versuche um Ausnahmen in einem untergeordneten Thread innerhalb des Try-Exception-Blocks im Hauptthread zu behandeln. Dieser Ansatz schlägt jedoch fehl, da die Methode thread_obj.start() sofort in ihrem eigenen Kontext und Stapel ausgeführt wird. Alle im untergeordneten Thread ausgelösten Ausnahmen befinden sich in ihrem eigenen Kontext, was es schwierig macht, sie direkt im Hauptthread abzufangen.

Message-Passing-Technik

Eine mögliche Lösung für Dieses Problem besteht darin, einen Mechanismus zur Nachrichtenübermittlung zwischen dem untergeordneten Thread und dem Hauptthread einzusetzen. Dieser Ansatz ermöglicht es dem untergeordneten Thread, Ausnahmen an den Hauptthread zurückzumelden.

Code-Implementierung

Der folgende Code zeigt, wie diese Nachrichtenübermittlungstechnik mithilfe einer Warteschlange implementiert wird:

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()
Nach dem Login kopieren

In diesem Code:

  • Die ExcThread-Klasse ist ein untergeordneter Thread, der einen auslöst Ausnahme.
  • Der Bucket ist eine Warteschlange, die als Kommunikationskanal zwischen dem untergeordneten Thread und dem Hauptthread dient.
  • Der Hauptthread überprüft den Bucket kontinuierlich auf Ausnahmen.
  • Wenn Wenn im Bucket eine Ausnahme gefunden wird, wird sie vom Hauptthread verarbeitet und gedruckt.
  • Sobald der untergeordnete Thread die Ausführung beendet hat, verbindet sich der Hauptthread mit it.

Durch die Verwendung dieser Methode können im untergeordneten Thread ausgelöste Ausnahmen effektiv kommuniziert und im Hauptthread behandelt werden, was eine ordnungsgemäße Ausnahmeverwaltung in Multithread-Anwendungen ermöglicht.

Das obige ist der detaillierte Inhalt vonWie fängt man Ausnahmen von einem untergeordneten Thread im Hauptthread ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage