我在Python中有一个线程程序工作正常,但是一旦线程运行就不会调用__del__:
class tt(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.stop_event = threading.Event()
def __del__(self):
print "Deleting"
self.stop_event.set()
time.sleep(5)
def run(self):
self.stop_event.clear()
while not self.stop_event.isSet():
self.do_stuff()
threading.Thread.__init__(self)
def stop(self):
self.stop_event.set()
例如,如果我
tc = aa()
del tc
它工作正常(我得到删除消息暂停等)。但是,如果我这样做:
tc = aa()
tc.start()
del tc
然后__del__没有运行(注意当我执行tc.start()时执行__del__; tc.stop(); del tc。
我在ipython中运行它
答案 0 :(得分:6)
当实例被垃圾回收时执行__del__()
方法,而不是在恰好指向实例的名称上调用del
时执行。后者只会删除名称(在某些情况下可能会导致名称为gc'ed的实例)。
当线程仍在运行时,永远不会对threading.Thread
实例进行垃圾回收,因为在这种情况下实例仍在使用中。抛弃恰好指向实例的名称肯定不会阻止该线程。
答案 1 :(得分:3)
请参阅documentation:
del x
不直接调用x.__del__()
- 前者将x的引用计数递减1,而后者仅在x的引用计数达到零时调用。
在您的情况下,线程仍在运行,并且仍然有一些(内部)引用。因此,当您从模块命名空间中删除它时,它的引用计数大于1,并且仍然大于零。由于它不是垃圾收集的,因此不会调用__del__
。