如果线程对象被重新分配,正在运行的线程是否有资格进行垃圾回收?例如:
class A(threading.Thread)
def run():
while True:
#Do stuff
a = A()
a.start()
time.sleep(60)
a = A()
在这个时候,即使A线程仍在执行任务,解释器是否可以销毁原始的A()线程?如果可以,有没有办法防止这种情况发生?
如果线程对象被重新分配,正在运行的线程是否有资格进行垃圾回收?例如:
class A(threading.Thread)
def run():
while True:
#Do stuff
a = A()
a.start()
time.sleep(60)
a = A()
在这个时候,即使A线程仍在执行任务,解释器是否可以销毁原始的A()线程?如果可以,有没有办法防止这种情况发生?
#!/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()
第一次运行! 第一次运行! 第一次运行! 第一次运行! 第一次运行! 第二次运行! 第一次运行! 第二次运行! 第一次运行! 第一次运行! 第二次运行! 第一次运行! 第二次运行! 第一次运行! 第二次运行! 第二次运行! 第二次运行! 第二次运行! 第二次运行!
如果有对对象的引用,则线程不会被垃圾回收。
请参见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()
终止时,它会清除该引用。
这样做并不能删除线程,但我猜你的问题是线程无缘无故消失了?未处理的异常会终止一个线程,而不影响主线程!它只会将回溯信息打印到标准错误流中,但你可能看不到...
threading.enumerate()
- 它会给出所有线程的列表。 - Jochen Ritzel