2012-10-29 4 views
11

मैं पायथन में एक थ्रेडेड प्रोग्राम लिख रहा हूं। यह प्रोग्राम उपयोगकर्ता (सीआरटीएल + सी) इंटरैक्शन द्वारा, और विभिन्न सिग्नल भेजने वाले अन्य कार्यक्रमों द्वारा अक्सर बाधित होता है, जिनमें से सभी को विभिन्न तरीकों से थ्रेड ऑपरेशन को रोकना चाहिए। थ्रेड अनुक्रम में काम की इकाइयों का एक गुच्छा करता है (मैं उन्हें "परमाणु" कहते हैं)।पायथन में एक रोकने योग्य धागा बनाने के लिए "सही" तरीका क्या है, जो काम के स्टॉपपेबल छद्म-परमाणु इकाइयों को दिया गया है?

प्रत्येक परमाणु को जल्दी और सुरक्षित रूप से रोका जा सकता है, इसलिए थ्रेड स्वयं को रोकना काफी मामूली है, लेकिन मेरा सवाल यह है: स्टॉपपेबल थ्रेड को लागू करने के लिए "दाएं" या कैननिकल तरीका क्या है, स्टॉपपेबल, छद्म- काम के परमाणु टुकड़े किए जाने के लिए?

क्या मुझे प्रत्येक परमाणु (उदाहरण के नीचे) से पहले stop_at_next_check ध्वज मतदान करना चाहिए? क्या मुझे प्रत्येक परमाणु को कुछ ऐसी चीज से सजाना चाहिए जो ध्वज-जांच (मूल रूप से उदाहरण के समान ही है, लेकिन सजावट में छिपा हुआ है)? या मुझे किसी अन्य तकनीक का उपयोग करना चाहिए जिस पर मैंने सोचा नहीं है?

उदाहरण (सरल बंद कर दिया-ध्वज की जाँच):

class stoppable(Thread): 
    stop_at_next_check = False 
    current_atom = None 

    def __init__(self): 
     Thread.__init__(self) 

    def do_atom(self, atom): 
     if self.stop_at_next_check: 
      return False 
     self.current_atom = atom 
     self.current_atom.do_work() 
     return True  

    def run(self): 
     #get "work to be done" objects atom1, atom2, etc. from somewhere 

     if not do_atom(atom1): 
      return 

     if not do_atom(atom2): 
      return 

     #...etc 

    def die(self): 
     self.stop_at_next_check = True 
     self.current_atom.stop() 

उत्तर

4

ध्वज जांच सही लगती है, लेकिन आप परमाणुओं की सूची का उपयोग करके इसे सरल बनाने के अवसर को याद करते हैं। यदि आप किसी सूची में परमाणु डालते हैं, तो आप do_atom() विधि की आवश्यकता के बिना लूप के लिए एकल का उपयोग कर सकते हैं, और जांच करने के लिए कहां समस्या हल हो जाती है।

def run(self): 
    atoms = # get atoms 
    for atom in atoms: 
     if self.stop_at_next_check: 
      break 
     self.current_atom = atom 
     atom.do_work() 
0

एक "धागा एक्स प्रसंस्करण जारी रखना चाहिए" झंडा बनाएं, और जब आप धागा लें, तो गलत पर ध्वज सेट।

सीधे धागे को मारना बुरा रूप माना जाता है, क्योंकि आपको काम का एक अंशकालिक हिस्सा मिल सकता है।

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