Python 线程集守护进程不工作

Python 线程集守护进程不工作,python,python-multithreading,Python,Python Multithreading,一个非常简单的脚本 test.py import temp temp.start() 临时工 import threading, time f=open("output.txt","w") def temp(): for i in range(5): f.write(str(i)) time.sleep(5) f.close() def start(): t=threading.Thread(target=temp) t.setD

一个非常简单的脚本

test.py

import temp
temp.start()
临时工

import threading, time
f=open("output.txt","w")
def temp():
    for i in range(5):
        f.write(str(i))
        time.sleep(5)
    f.close()
def start():
    t=threading.Thread(target=temp)
    t.setDaemon(True)
    t.start()

我希望守护进程线程在主进程
test.py
立即退出时完成。但是
守护进程
线程与主进程一起退出,并且不像
守护进程那样运行。我是否缺少一些基本内容?

这在

最相关的位是:

线程可以标记为“守护线程”。这一点的意义 标志是当只有守护进程线程时,整个Python程序退出 剩下的就剩下了

守护进程线程在关闭时突然停止。他们的资源(例如 因为打开的文件、数据库事务等)可能不会被释放 对

术语“daemon”的重载和否定扭曲可能会让人有点困惑,但归根结底是:python程序只有在其所有线程完成后才会退出,但daemon线程除外,如果没有其他非daemon线程,它将被终止。在您的情况下,这意味着程序在有机会做任何事情之前退出杀死守护进程线程(或者相反,如果您
setDaemon(false)
,则在线程完成之前不会退出)

作为补充,您的问题的一个可能解决方案是在您的情况下使用:

t.join()
有关加入“”的详细信息


可以在以下网址找到一个很好的指南,以实用的方式进行解释:

为什么线程会“完成”?文档似乎非常清楚“守护进程线程在关闭时突然停止。它们的资源(如打开的文件、数据库事务等)可能无法正常释放。如果希望线程正常停止,请将其设为非守护进程,并使用适当的信号机制,如事件。”@然后主进程等待线程完成,这就是程序的关闭守护进程线程”基本上是指“在关闭python运行时不考虑此线程”。它只是被抛出。不,我再次提醒你,你应该在“一个线程可以被标记为“守护线程”时查看文档。这个标记的意义是,当只剩下守护线程时,整个Python程序就会退出。“如果你剩下一个非守护线程,程序就不会退出。”。它仅在保留守护进程(或没有)线程时退出。相关:由于文档中说“…守护进程属性从当前线程继承”,因此在OP的情况下,主线程不需要调用
setDaemon(false)
。此外,
setDaemon()
是旧的getter/setter API的一部分,因此直接设置属性将是一种“现代”的方式。@martineau一般来说,没有,但海报就是这样做的,这就是答案所包含的(我刚刚注意到海报删除了带有该位的评论,但这就是为什么我们继续讨论
setDaemon