Maison > Article > développement back-end > Comment détecter les exceptions de thread enfant dans un thread parent en Python ?
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 :
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!