使用__del__停止python线程

时间:2011-08-03 15:18:59

标签: python multithreading

我在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中运行它

2 个答案:

答案 0 :(得分:6)

当实例被垃圾回收时执行__del__()方法,而不是在恰好指向实例的名称上调用del时执行。后者只会删除名称(在某些情况下可能会导致名称为gc'ed的实例)。

当线程仍在运行时,永远不会对threading.Thread实例进行垃圾回收,因为在这种情况下实例仍在使用中。抛弃恰好指向实例的名称肯定不会阻止该线程。

答案 1 :(得分:3)

请参阅documentation

  

del x不直接调用x.__del__() - 前者将x的引用计数递减1,而后者仅在x的引用计数达到零时调用。

在您的情况下,线程仍在运行,并且仍然有一些(内部)引用。因此,当您从模块命名空间中删除它时,它的引用计数大于1,并且仍然大于零。由于它不是垃圾收集的,因此不会调用__del__