2009-06-01 30 views
7

我需要跨線程邊界傳遞異常。我如何通過Python中的線程之間的異常

我使用嵌入非線程安全的應用程序,它具有一個線程調用安全,post_event(贖回),要求從主線程調用蟒蛇。

我運行在一個單獨的線程一個GUI PyGTK的,所以一個按鈕被按下時,我發佈事件與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

#what做我在這裏做?我如何存儲異常?

使用sys.exc_info()[:2],看到this wiki

最佳方法的線程之間通信是Queue。讓主線程實例化一個Queue.Queue實例並將其傳遞給子線程;當一個子線程擁有的東西回來傳達給主人就對隊列使用.put(例如使用線程ID,異常類型,異常值的元組 - 或者,其他有用的信息,不一定是異常有關,只要確保第一項元組標識了信息的種類;-)。主人可以在需要時返回那些信息單元,並提供各種同步選項等等。

+0

正是我之後,謝謝。 通常我會用隊列等,但我「重新發明輪子」,因爲只有一件事應該在我的腳本中的任何一個時間運行,我想的是,應用程序的線程中執行完成,給的東西我在gtk線程採取任何進一步的行動之前得到的結果。我基本上試圖用兩個線程僞造單線程。它令人討厭,但它似乎工作正常。 – DaedalusFall 2009-06-01 20:54:06