Maison > développement back-end > Tutoriel Python > Comment détecter les exceptions générées dans les threads enfants en Python ?

Comment détecter les exceptions générées dans les threads enfants en Python ?

Susan Sarandon
Libérer: 2024-11-09 20:12:02
original
858 Les gens l'ont consulté

How to Catch Exceptions Raised in Child Threads in Python?

Détecter l'exception d'un thread dans le fil appelant

En Python, la programmation multithread présente des défis dans la gestion des exceptions qui se produisent dans les threads enfants. Lorsque des exceptions surviennent dans un thread enfant, elles restent confinées à ce thread, ce qui rend difficile leur capture et leur traitement par le thread appelant.

Problème principal et justification

Le principal problème réside dans l’immédiateté de la méthode thread_obj.start(). Cette méthode lance l'exécution du thread enfant dans son propre contexte et sa propre pile. Par conséquent, toutes les exceptions qui se produisent dans le fil de discussion enfant ne sont pas propagées au fil de discussion appelant.

Surmonter le problème

Pour résoudre ce problème, une technique efficace consiste à employer message qui passe. Dans cette approche, un canal de communication est établi entre les threads enfants et appelants, permettant au thread enfant de transmettre des informations d'exception à son parent.

Mise en œuvre

Vous trouverez ci-dessous un exemple qui montre comment capturer les exceptions du thread enfant et les afficher dans le thread appelant :

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()
Copier après la connexion

Explication

Dans cet exemple, la classe ExcThread agit en tant qu'enfant thread chargé de générer une exception. La fonction main() sert de thread appelant. Un canal de communication est établi à l'aide de l'objet queue.Queue() (appelé bucket dans le code).

Dans la méthode run() de ExcThread, toute exception qui se produit est placée dans le bucket. Le thread appelant vérifie en permanence le compartiment dans une boucle. Lorsqu'une exception est disponible dans le bucket, elle est récupérée et les détails de l'exception (type, objet et trace) sont imprimés.

Cette approche comble efficacement le fossé de communication entre le thread enfant et le thread appelant. , permettant à ce dernier d'attraper et de gérer les exceptions générées dans le premier.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal