2009-06-01 3 views
7

스레드 경계를 넘어 예외를 전달해야합니다.파이썬에서 스레드간에 예외를 전달하는 방법

파이썬은 스레드 안전 호출, post_event (callable)이 있는데, 호출 스레드는 주 스레드에서 호출됩니다.

별도의 스레드에서 pygtk gui를 실행 중이므로 버튼을 클릭하면 post_event 이벤트를 게시하고 계속하기 전에 완료 될 때까지 기다립니다. 그러나 호출 수신자에게 호출 수신자가 예외를 던졌는지 여부를 알 필요가 있으면 호출자에게 전달해야합니다. 나는 그 추적에 대해서 너무 걱정하지 않는다. 단지 예외 그 자체 다.

내 코드는 대략 다음과 같습니다

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 

감사 어떤 도움이, 감사합니다.

답변

12

# 여기가 어떻게됩니까? 예외는 어떻게 저장합니까? 스레드간에 통신 할 수

사용 sys.exc_info()[:2] 참조 this wiki

가장 좋은 방법은 Queue입니다. 주 스레드가 Queue.Queue 인스턴스를 인스턴스화하고 하위 스레드로 전달하십시오. 하위 스레드가 마스터에게 다시 통신 할 내용이있는 경우 해당 큐에서 .put을 사용합니다 (예 : 스레드 ID, 예외 유형, 예외 값 또는 기타 유용한 정보, 예외 관련 항목이 아닌 튜플). 첫 번째 항목 터플의 종류는 정보의 종류를 나타냅니다 ;-). 마스터는 .get 정보 단위를 원할 때 동기화 할 수 있도록 다양한 선택을 할 수 있습니다.

+0

감사합니다. 감사합니다. 일반적으로 대기열 등을 사용 하겠지만 한 번에 한 스크립트 만 실행해야하기 때문에 휠을 다시 고안하고 있습니다. 앱의 스레드에서 실행되어 완료되고 제공되는 물건이 필요하기 때문에 gtk 스레드에서 추가 조치를 취하기 전에 결과가 나옵니다. 기본적으로 두 개의 스레드로 하나의 스레딩을 위조하려고합니다. 그것의 성가신하지만 괜찮아 보이는 것 같습니다. – DaedalusFall

관련 문제