为什么守护程序线程在其环境被破坏时不会死亡?

时间:2013-07-25 11:42:42

标签: python multithreading

我有一个Python脚本,它从另一个线程启动一个线程。这是一个实际上实现kill a python thread能力的学习练习,它在我正在编写的应用程序中有用。忽略红色鲱鱼,线程FirstThread启动线程SecondThread,为了我们的目的,它被捕获在循环中并且没有资源可以释放。考虑:

import threading
import time


class FirstThread (threading.Thread):
    def run(self):
        b = SecondThread()
        b.daemon = True
        b.start()
        time.sleep(3)
        print("FirstThread going away!")
        return True


class SecondThread (threading.Thread):
    def run(self):
        while True:
            time.sleep(1)
            print("SecondThread")


a = FirstThread()
a.daemon = True
a.start()


print("Waiting 5 seconds.")
time.sleep(5)
print("Done waiting")

虽然FirstThread确实打印出“FirstThread消失!”在预期3秒后,SecondThread继续将“SecondThread”打印到stdout。我预计SecondThread会被销毁FirstThread,因为它是a daemon thread。那么,为什么SecondThread继续存在,即使它的环境(FirstThread)已被破坏?

1 个答案:

答案 0 :(得分:1)

线程本质上不是分层的。 AFAIK,一个线程在它创建的环境中维护一个闭包,但就是这样。所有线程都归进程所有。 daemon线程只是在应用程序退出之前不会加入的线程。简而言之,您的示例中FirstThreadSecondThread之间没有关联。