我有一个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)已被破坏?
答案 0 :(得分:1)
线程本质上不是分层的。 AFAIK,一个线程在它创建的环境中维护一个闭包,但就是这样。所有线程都归进程所有。 daemon
线程只是在应用程序退出之前不会加入的线程。简而言之,您的示例中FirstThread
和SecondThread
之间没有关联。