2012-09-18 5 views
5

कभी-कभी मैं एक कक्षा चाहता हूं जो लगातार एक कार्यकर्ता धागे द्वारा अद्यतन किया जाता है जो इसे बनाए जाने पर उत्पन्न होता है। मूल रूप से इस तरह:पायथन में, क्या ऐसे धागे बनाने का कोई तरीका है जो मरने पर एक संदर्भ नहीं देते हैं?

class MyWidget: 
    def __init__(self): 
     self.blah = None 
     self.thread = MyThread(self) 
     self.thread.start() 

    def update(self, blah): 
     self.blah = blah 

class MyThread(threading.Thread): 
    def __init__(self, widget): 
     self.widget = widget 

    def run(self): 
     while True: 
      time.sleep(1) 
      blah = poll() 
      self.widget.update(blah) 

मैं एक सुरक्षित तरीका यह डिजाइन करने के लिए चाहते हैं, ताकि मुझे यकीन है कि धागा MyWidget अब जरूरत है, जब मर जाता है कर रहा हूँ। उपरोक्त कोड के साथ समस्या यह है कि MyWidget कभी मर नहीं जाएगा क्योंकि इसे MyThread द्वारा जीवित रखा जा रहा है। मैं इसे MyThreadweakref.refMyWidget पर देकर और संदर्भ के मरने पर लूप को तोड़कर ठीक कर सकता हूं लेकिन मैंने अतीत में ऐसा करने की गलती नहीं की है।

जो मुझे वास्तव में पसंद है वह थ्रेड है जो सब कुछ के साथ कचरा इकट्ठा होता है। अर्थात। एक धागा जो संदर्भ ग्राफ और मुख्य धागे के संदर्भ ग्राफ के दौरान मारा जाता है, विवादित होते हैं। क्या ऐसा जानवर लिखना संभव होगा? क्या वे पहले से मौजूद हैं?

उत्तर

1

आप MyThread संशोधित करते हैं एक stop विधि प्रदान करने के लिए:

class MyThread(threading.Thread): 
    def __init__(self, widget): 
     self.widget = widget 
     self.is_running = False 
     super(MyThread, self).__init__() 

    def run(self): 
     self.is_running = True 
     while self.is_running: 
      time.sleep(1) 
      blah = poll() 
      self.widget.update(blah) 

    def stop(self): 
     self.is_running = False 

बिंदु जहां MyWidget उदाहरण अब जरूरत है आप widget.thread.stop() कॉल कर सकते हैं पर हैं, इस सूत्र को मारने और सब कुछ जीसी 'होने के लिए अनुमति देगा घ।

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