一个非常简单的脚本。
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()
我希望Daemon线程会在主进程test.py
立即退出时完成。但是该daemon
线程与主线程一起退出并且不像daemon
.E一样。我在这里缺少一些基本内容吗?
python文档中对此进行了详细描述
https://docs.python.org/3/library/threading.html
最相关的位是:
线程可以标记为“守护程序线程”。该标志的重要性在于,仅保留守护程序线程时,整个Python程序都会退出。
和
守护程序线程在关闭时突然停止。它们的资源(例如打开的文件,数据库事务等)可能无法正确释放。
术语“守护程序”的超载和否定扭曲会使这有些混乱,但其归结为:python程序仅在其所有线程完成后退出,除非守护程序线程在没有其他线程的情况下被终止剩下非守护进程线程。在您的情况下,这意味着程序在有机会做任何事情之前退出杀死您的守护程序线程(或者相反,如果您完成了线程运行,则退出setDaemon(false)
)。
由于文档说“ ...守护程序属性是从当前线程继承的”,因此
setDaemon(false)
在OP的情况下不需要主线程进行调用。除了setDaemon()
是旧的 getter / setter API的一部分,因此直接设置属性将是“现代”方法。通常,@ martineau没有,但这是发布者所做的,所以这就是答案所包含的内容(我只是注意到发布者删除了该位的注释,但这就是我们继续进行工作的原因
setDaemon
)