2010-12-20 15 views
6

क्या थ्रेड ऑब्जेक्ट को फिर से डिजाइन किया गया है तो कचरा संग्रह के लिए एक चलने वाला धागा पात्र है? उदाहरण के लिए:पायथन धागे कचरा संग्रह

class A(threading.Thread) 
    def run(): 
     while True: 
      #Do stuff 


a = A() 
a.start() 
time.sleep(60) 
a = A() 
इस बिंदु पर

, भले ही धागा एक अभी भी सामान कर रहा है, दुभाषिया मूल ए() धागा नष्ट कर सकते हैं? यदि ऐसा होता है, तो ऐसा होने से रोकने के लिए कोई तरीका है?

उत्तर

5

मेरा अनुमान नहीं है। चीजों का ट्रैक रखने के लिए पाइथन का उपयोग करने वाली किसी भी संरचना में धागे का एक संदर्भ अभी भी है। मैं इसका परीक्षण करूंगा, लेकिन अगर यह काम नहीं करता तो मैं आश्चर्यचकित हूं।

संपादित इसे देखें:

#!/usr/bin/env python 
import threading, time 

class A(threading.Thread): 
    def __init__(self, name): 
      threading.Thread.__init__(self) 
      self.name=name 
      self.count=0 
    def run(self): 
      while self.count<10: 
        print self.name, "Running!" 
        time.sleep(1) 
        self.count+=1 

a=A("first") 
a.start() 
time.sleep(5) 
a=A("second") 
a.start() 
first Running! 
first Running! 
first Running! 
first Running! 
first Running! 
second Running! 
first Running! 
second Running! 
first Running! 
first Running! 
second Running! 
first Running! 
second Running! 
first Running! 
second Running! 
second Running! 
second Running! 
second Running! 
second Running! 
second Running!
+0

मैंने सोचा नहीं, और ऐसा लगता है। मैं सिर्फ अजीब त्रुटियों (एक डेटाबेस में परिणाम) है कि मैंने सोचा था कि इस से समझाया जा सकता है दिखाई दे रही है। लेकिन मेरे पास इस मामले का परीक्षण करने का कोई तरीका नहीं है। – Falmarri

+4

वे हटाए नहीं जाएंगे, 'threading.enumerate() 'देखें - यह सभी धागे की एक सूची देता है। –

3

धागे अभ्यस्त उस तरह से हटा दिया जाता है, लेकिन मुझे लगता है कि समस्या आप हैं, वे धागे बिना किसी कारण के गायब है? एक अनचाहे अपवाद मुख्य धागे को प्रभावित किए बिना धागे को मार देगा! यह केवल stderr को ट्रैस बैक प्रिंट, लेकिन आप उस दिखाई न दे ...

0

धागे कचरा एकत्र नहीं किया जाएगा अगर वहाँ वस्तु के लिए एक संदर्भ है कहीं रखा।

https://hg.python.org/cpython/file/2.7/Lib/threading.py देखें, यह थ्रेड ऑब्जेक्ट्स पर टैब रखता है।

# Active thread administration 
_active_limbo_lock = _allocate_lock() 
_active = {} # maps thread id to Thread object 
_limbo = {} 

threading मॉड्यूल मॉड्यूल चर में संदर्भ रखता है। जब आप threading.enumerate() पर कॉल करते हैं तो आप एक ही चर पर पुनरावृत्त होते हैं।

जब आप start() पर कॉल करते हैं तो यह मॉड्यूल चर में Thread ऑब्जेक्ट का संदर्भ देता है और जब run() समाप्त हो जाता है, तो यह संदर्भ को साफ़ करता है।

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