Python线程守护程序属性

Fal*_*rri 44 python multithreading daemon python-multithreading

关于将线程设置为守护进程意味着什么,我有点困惑.文档说明了这一点:

线程可以标记为"守护程序线程".这个标志的意义在于,当只剩下守护进程线程时,整个Python程序都会退出.初始值继承自创建线程.可以通过守护程序属性设置该标志.

我不确定是什么让这与普通线程不同.这是说这个程序永远不会完成吗?

def threadfunc():
    while True:
        time.sleep(1)

threading.Thread(target=threadfunc).start()
Run Code Online (Sandbox Code Playgroud)

即使主线程完成它的执行.而

def threadfunc():
    while True:
        time.sleep(1)

th = threading.Thread(target=threadfunc)
th.daemon = True
th.start()
Run Code Online (Sandbox Code Playgroud)

马上完成?

我问,因为我有一个情况,在我的主线程中我正在调用sys.exit(),并且进程只是挂起而我的其他线程正在运行,因为我可以看到日志.这与使用线程活动调用的sys.exit()有什么关系吗?

Joc*_*zel 41

这是说这个程序永远不会完成吗?

是的,该程序无法完成,只需尝试一下即可.

我问,因为我有一个情况,在我的主线程中我正在调用sys.exit(),并且进程只是挂起而我的其他线程正在运行,因为我可以看到日志.这与使用线程活动调用的sys.exit()有什么关系吗?

是的,即使exit不会阻止其他线程,它只是SystemExit在主线程中引发.因此,虽然主线程将停止(就像在任何其他未处理的Exception上一样),所有其他非守护线程将继续工作.


Tel*_*Sam 13

设置thread.daemon = True将允许主程序退出.应用程序通常会等到所有子线程完成后再完成.

  • @ erm3nda不太正确。使用Thread时,没有多余的* process。*。请记住,没有其他措施,所有Python程序都是单个进程。`.join()`将阻塞调用范围,直到线程结束为止,如果它永远不会结束,那当然是个问题。将线程配置为守护进程只会告诉父线程在需要时杀死它,而不是在父线程想要退出时隐式地执行.join()。我实际上是在几秒钟前才学到的,由于某种原因,这对我来说是非常违反直觉的。 (2认同)

Ale*_*ret 5

th.daemon = True #set this thread as a Daemon Thread
Run Code Online (Sandbox Code Playgroud)

您可以将Daemon线程作为服务来考虑,这意味着它将在计算机中执行不同任务的后台运行,例如索引文件,解析xml,检索新闻等,这是一个长期运行的过程。

您的Main线程将完成,并且守护程序仍将在后台运行,这就是您的程序又称为Main线程完成的原因,如果您只想进行无限循环,您将看到线程仍在运行。守护程序线程的一个示例是垃圾回收。

  • _“您的主线程将完成,您的守护进程仍将在后台运行”_ - 当线程_不是_守护进程时,情况不正是如此吗? (5认同)