Maison > développement back-end > Tutoriel Python > Comment détecter les exceptions de thread enfant dans un thread parent en Python ?

Comment détecter les exceptions de thread enfant dans un thread parent en Python ?

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

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

Gestion des exceptions dans les applications Python multithread

En Python, la programmation multithread vous permet d'exécuter des tâches simultanément. Cependant, la gestion des exceptions dans des contextes multithread peut s'avérer difficile. Cet article aborde un problème spécifique : détecter les exceptions qui se produisent dans un thread enfant à partir du thread parent.

Le problème survient car le thread enfant fonctionne indépendamment avec son propre contexte et sa propre pile. Les exceptions levées dans le thread enfant ne sont pas immédiatement visibles par le thread parent. Les blocs try-sauf traditionnels dans le fil de discussion parent, comme indiqué ci-dessous, ne fonctionneront pas :

try:
    threadClass.start()   ##### **Exception takes place here**
except:
    print "Caught an exception"
Copier après la connexion

Pour résoudre ce problème, nous pouvons utiliser la transmission de messages. Le thread enfant peut envoyer des informations d'exception au thread parent à l'aide d'une structure de données partagée comme une file d'attente.

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

Dans cet exemple :

  1. Un compartiment de file d'attente est créé pour partager l'exception. informations.
  2. Un ExcThread est initialisé avec une référence au bucket.
  3. Le thread principal vérifie en permanence les exceptions dans la file d'attente.
  4. Si une exception est trouvée, le thread principal le thread peut le gérer de manière appropriée.

L'utilisation de la transmission de messages permet une communication efficace des exceptions entre les threads.

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