Maison  >  Article  >  développement back-end  >  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
Susan Sarandonoriginal
2024-11-09 12:06:02143parcourir

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"

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

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!

Déclaration:
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