2010-12-20 13 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が物事を追跡するためにどのような構造のスレッドにも参照があります。私はそれを試してみるが、それがうまくいかなかったら私は驚くだろう。

EDITそれをチェックアウト:

#!/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

スレッドが文句を言わないことのように削除されますが、私はあなたが持っている問題は、スレッドが理由もなく消えるということですね? A未処理例外は、メインスレッドに影響を与えずにスレッドを強制終了します。トレースバックを標準エラー出力に出力するだけですが、それが表示されない場合があります。

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()が終了すると参照がクリーンアップされます。

関連する問題