Python线程中守护线程属性的含义
我对把线程设置为守护线程有点困惑。
文档上是这么说的:
一个线程可以被标记为“守护线程”。这个标记的意思是,当只剩下守护线程时,整个Python程序会退出。这个标记的初始值是从创建它的线程那里继承来的。可以通过daemon属性来设置这个标记。
我不太明白这和普通线程有什么不同。
这是不是说这个程序永远不会结束?
def threadfunc():
while True:
time.sleep(1)
threading.Thread(target=threadfunc).start()
即使主线程完成了它的执行,守护线程会立即结束吗?
def threadfunc():
while True:
time.sleep(1)
th = threading.Thread(target=threadfunc)
th.daemon = True
th.start()
我问这个是因为在我的主线程中调用了sys.exit(),但程序却卡住了,我可以在日志中看到其他线程还在运行。
这和在有线程活着的情况下调用sys.exit()有关吗?
3 个回答
7
th.daemon = True #set this thread as a Daemon Thread
你可以把守护线程想象成一种服务,这意味着它会在你电脑的后台运行,执行各种任务,比如索引文件、解析xml、获取新闻等等,任何需要长时间运行的过程。
你的主线程会结束,而守护线程仍然在后台运行。这就是为什么你的程序(也就是主线程)结束后,守护线程还在继续工作的原因。如果你想让它一直运行,只需放一个无限循环,你就会看到这个线程还在运行。
一个守护线程的例子就是垃圾回收。
22
把 thread.daemon = True
设为真,可以让主程序直接退出。通常情况下,应用程序会等所有的子线程都完成后才会结束。
55
这是不是在说这个程序永远也不会结束?
没错,这个程序是不会结束的,试试看就知道了。
我问这个是因为我在主线程里调用了 sys.exit(),结果程序就卡住了, 而我的其他线程还在运行,我 可以从日志中看到它们在工作。这 和调用 sys.exit() 时还有线程在 活着有关系吗?
是的,即使是 exit
也不会停止其他线程,它只是让主线程抛出 SystemExit
。所以主线程会停止(就像遇到其他未处理的异常时一样),但是所有其他非守护线程会继续运行。