我对将线程设置为守护进程意味着什么感到困惑。文档说明了这一点:
一个线程可以被标记为“守护进程” 线”。这面旗帜的意义 是整个Python程序 仅在守护程序线程时退出 剩下。初始值是继承的 来自创建线程。国旗可以 通过守护进程属性设置。
我不确定是什么让这与普通线程不同。这是说这个程序永远不会完成吗?
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()有什么关系吗?
答案 0 :(得分:36)
这是说这个程序永远不会完成吗?
是的,该程序无法完成,只需尝试一下即可。
我问,因为我有一个情况 在我的主线程中,我正在打电话 sys.exit(),进程只是挂起 我的其他线程正在运行 可以看到日志。这有吗? 与sys.exit()有关 用线程调用活着?
是的,即使exit
也不会阻止其他线程,它只会在主线程中引发SystemExit
。因此,虽然主线程将停止(就像在任何其他未处理的Exception上一样),所有其他非守护线程将继续工作。
答案 1 :(得分:12)
设置thread.daemon = True
将允许主程序退出。应用程序通常会等到所有子线程完成后再完成。
答案 2 :(得分:4)
th.daemon = True #set this thread as a Daemon Thread
您可以将守护程序线程视为服务,这意味着它将在您的计算机后台执行不同的任务,例如索引文件,解析xml,检索新闻等,以及任何长时间运行的过程。< / p>
您的主线程将完成,您的守护程序仍将在后台运行,这就是您的程序又称主线程完成的原因,如果您只想放置一个无限循环,您将看到您的线程仍在运行。 守护程序线程的一个示例是垃圾收集。
答案 3 :(得分:-1)