使用__del__停止python线程

Ros*_*s W 5 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()
Run Code Online (Sandbox Code Playgroud)

例如,如果我这样做

tc = aa()
del tc 
Run Code Online (Sandbox Code Playgroud)

它工作正常(我得到删除消息暂停等).但是,如果我这样做:

tc = aa()
tc.start()
del tc
Run Code Online (Sandbox Code Playgroud)

然后__del__没有运行(注意当我执行tc.start(); tc.stop(); del tc时它会执行__del__.

我在ipython中运行它

Sve*_*ach 6

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

一个threading.Thread实例将永远不会被垃圾收集,而线程仍在运行,因为实例仍然在这种情况下使用.抛弃恰好指向实例的名称肯定不会阻止该线程.