Python 线程垃圾回收

8

如果线程对象被重新分配,正在运行的线程是否有资格进行垃圾回收?例如:

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


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

在这个时候,即使A线程仍在执行任务,解释器是否可以销毁原始的A()线程?如果可以,有没有办法防止这种情况发生?

3个回答

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()
第一次运行!
第一次运行!
第一次运行!
第一次运行!
第一次运行!
第二次运行!
第一次运行!
第二次运行!
第一次运行!
第一次运行!
第二次运行!
第一次运行!
第二次运行!
第一次运行!
第二次运行!
第二次运行!
第二次运行!
第二次运行!
第二次运行!

我也这样认为,而且似乎可以工作。我只是看到一些奇怪的错误(在数据库中的结果),我认为这可能可以解释。但我无法测试这种情况。 - Falmarri
6
它们不会被删除,看一下 threading.enumerate() - 它会给出所有线程的列表。 - Jochen Ritzel

4

如果有对对象的引用,则线程不会被垃圾回收。

请参见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() 终止时,它会清除该引用。


4

这样做并不能删除线程,但我猜你的问题是线程无缘无故消失了?未处理的异常会终止一个线程,而不影响主线程!它只会将回溯信息打印到标准错误流中,但你可能看不到...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接