Python 线程集守护进程不工作
一个非常简单的脚本 test.pyPython 线程集守护进程不工作,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
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
)