为什么主线程等待后台线程完成

时间:2019-11-27 12:26:50

标签: python-3.x multithreading

给出以下代码:

from threading import Thread

def dosomething():
    for _ in range(100):
        print("background thread running")


t = Thread(target=dosomething)
t.start()

只要后台线程需要完全通过循环,程序就会运行。我的问题是,为什么主线程要等待后台线程完成而在启动后台线程后没有立即退出。

2 个答案:

答案 0 :(得分:2)

因为那是事实。来自threading docs

  

可以将一个线程标记为“守护程序线程”。该标志的重要性在于,仅保留守护程序线程时,整个Python程序都会退出。初始值是从创建线程继承的。可以通过daemon属性或daemon构造函数参数设置该标志。

我假设您在命令行上运行了python my_script.py之类的东西,想知道为什么在工作线程完成之前,它不会让您返回提示?

好吧,如果您将代码更改为:

from threading import Thread

def dosomething():
    for _ in range(100):
        print("background thread running")


t = Thread(target=dosomething, daemon=True)
t.start()

您将发现您已返回到终端。但是,您的守护程序线程也将消失(同样来自文档):

  

注意守护程序线程在关闭时突然停止。它们的资源(例如打开的文件,数据库事务等)可能无法正确释放。如果您希望线程正常停止,请使其成为非守护进程,并使用适当的信号机制,例如事件。

这是因为杀死程序意味着杀死进程,并且由于该工作线程由该进程处理而死亡,请尝试this article以获得更详细的解释。

答案 1 :(得分:2)

因为这就是应该的样子!

在多线程之前的日子里,程序会在其main例程结束时结束,这恰好也是在其最后一个(也是唯一的)线程结束时结束。当多线程成为现实时,某些语言(例如Python,Java)将经典行为概括为“程序在最后一个线程结束时结束”,而其他语言(例如C / C ++)将其概括为“程序在{{ 1}}线程结束。”

在这两个领域都曾经工作过,我坚信Python和Java正确无误。 main线程的特殊之处在于它是第一个线程:它是调用程序的指定入口点的那个线程。但是,事情进展以后,没有充分的理由说明为什么main线程应该与其他任何线程区别对待。那只会使事情复杂化,使行为变得更加难以解释。