2009-06-01 7 views
7

スレッドの境界を越えて例外を渡す必要があります。Pythonのスレッド間で例外を渡す方法

私はpythonをスレッドセーフな呼び出しpost_event(callable)を持った非スレッドセーフなアプリケーションに埋め込みました。これはメインスレッドから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

私はまさに私が後にしたこと、ありがとう。 通常はキューなどを使用しますが、スクリプト内でいつでも1つだけ実行する必要があるため、ホイールを再発明しています。私がgtkスレッドで何か別のアクションをとる前の結果です。私は基本的に2つのスレッドで1つのスレッドを偽造しようとしています。その迷惑なが、それはうまく動作しているようだ。 – DaedalusFall

関連する問題