Python线程守护程序属性

时间:2010-12-01 23:13:47

标签: python multithreading daemon

我对将线程设置为守护进程意味着什么感到困惑。文档说明了这一点:

  

一个线程可以被标记为“守护进程”   线”。这面旗帜的意义   是整个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()有什么关系吗?

4 个答案:

答案 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)

  1. 当主线程结束时,带有守护进程的线程不会结束。
  2. 没有守护进程的线程将在主线程结束时结束。