2010-12-20 131 views
6

如果線程對象被重新分配,是否有可用於垃圾回收的正在運行的線程?例如:Python線程垃圾回收

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


a = A() 
a.start() 
time.sleep(60) 
a = A() 

在這一點上,即使線程A仍在做東西,解釋器是否可以銷燬原始的A()線程?如果是這樣,是否有辦法防止這種情況發生?

回答

5

我的猜測是否定的。在Python用來跟蹤事物的任何結構中仍然有對該線程的引用。我會測試它,但如果它不起作用,我會感到驚訝。

編輯檢查出來:

#!/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 2010-12-20 23:02:38

+4

它們不會被刪除,參見'threading.enumerate()' - 它給出了所有線程的列表。 – 2010-12-20 23:06:03

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()終止時清除引用。