2009-06-01 6 views
7

Necesito pasar excepciones a través de un límite de subproceso.Cómo paso una excepción entre subprocesos en python

Estoy usando python incrustado en una aplicación que no es segura para la ejecución de subprocesos y que tiene una llamada segura para subprocesos, post_event (invocable), que llama a las llamadas desde su subproceso principal.

Estoy ejecutando un guion pygtk en un hilo separado, por lo que cuando se hace clic en un botón publico un evento con post_event, y espero a que termine antes de continuar. Pero necesito que la persona que llama sepa si el destinatario lanzó una excepción, y la levantará si es así. No estoy demasiado preocupado por el rastreo, solo la excepción en sí misma.

Mi código es más o menos:

class Callback(): 
    def __init__(self,func,*args): 
     self.func=func 
     self.args=args 
     self.event=threading.Event() 
     self.result=None 
     self.exception=None 
    def __call__(self): 
     gtk.gdk.threads_enter() 
     try: 
      self.result=self.func(*self.args) 
     except: 
      #what do I do here? How do I store the exception? 
      pass 
     finally: 
      gtk.gdk.threads_leave() 
      self.event.set() 
    def post(self): 
     post_event(self) 
     gtk.gdk.threads_leave() 
     self.event.wait() 
     gtk.gdk.threads_enter() 
     if self.exception: 
      raise self.exception 
     return self.result 

Cualquier ayuda apreciada, gracias.

Respuesta

12

#¿qué hago aquí? ¿Cómo almaceno la excepción?

Uso sys.exc_info()[:2], ver this wiki

mejor manera de comunicarse entre los hilos es Queue. Haga que el hilo principal crea una instancia de Queue.Queue y páselo a subprocesos; cuando un subhebra tiene algo que comunicar al maestro, usa .put en esa cola (por ejemplo, una tupla con id. de subproceso, tipo de excepción, valor de excepción u otra información útil, no necesariamente relacionada con la excepción, solo asegúrese de que el primer elemento de una tupla identifica el tipo de información ;-). El maestro puede .get esas unidades de información cuando lo desee, con varias opciones de sincronización, etc.

+0

Exactamente lo que estaba buscando, gracias. Normalmente usaría colas, etc., pero estoy 'reinventando la rueda' porque solo una cosa debería estar ejecutándose en un momento dado en mi script, y quiero cosas que se ejecuten en el hilo de la aplicación para finalizar y dar me resulta un resultado antes de tomar cualquier medida adicional en el hilo gtk. Básicamente estoy tratando de falsificar subprocesos individuales con dos hilos. Es molesto, pero parece estar funcionando bien. – DaedalusFall

Cuestiones relacionadas