2009-06-01 11 views
7

में धागे के बीच अपवाद कैसे पास करूं, मुझे थ्रेड सीमा में अपवाद पारित करने की आवश्यकता है।मैं पाइथन

मैं एक गैर थ्रेड सुरक्षित ऐप में एम्बेडेड पायथन का उपयोग कर रहा हूं जिसमें एक थ्रेड सुरक्षित कॉल, post_event (कॉल करने योग्य) है, जो इसके मुख्य धागे से कॉल करने योग्य कहता है।

मैं एक अलग थ्रेड में एक पिगेटक गुई चला रहा हूं, इसलिए जब कोई बटन क्लिक किया जाता है तो मैं 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 का उपयोग करता है (उदाहरण के लिए थ्रेड आईडी, अपवाद प्रकार, अपवाद मान - या अन्य उपयोगी जानकारी के साथ एक टुपल, जरूरी नहीं कि अपवाद से संबंधित, बस सुनिश्चित करें कि पहला आइटम एक टुपल की जानकारी की तरह पहचानता है ;-)। मास्टर .get उन जानकारी-इकाइयों को वापस जब चाहें, सिंक्रनाइज़ेशन के लिए विभिन्न विकल्पों के साथ और इसी तरह से कर सकते हैं।

+0

वास्तव में मैं क्या कर रहा था, धन्यवाद। आम तौर पर मैं कतारों का उपयोग करता हूं, आदि, लेकिन मैं 'पहिया का पुन: आविष्कार कर रहा हूं' क्योंकि मेरी स्क्रिप्ट में किसी एक समय में केवल एक चीज चलनी चाहिए, और मुझे वह सामान चाहिए जो ऐप के धागे को खत्म करने और देने के लिए चलता है मैं gtk धागे में कोई और कार्रवाई करने से पहले एक परिणाम। मैं मूल रूप से दो थ्रेड के साथ नकली एकल थ्रेडिंग की कोशिश कर रहा हूं। यह कष्टप्रद है लेकिन ऐसा लगता है कि यह ठीक काम कर रहा है। – DaedalusFall

संबंधित मुद्दे