Python中的主线程

Python中的主线程,python,multithreading,Python,Multithreading,我有一个很长的程序,里面有很多线程。我创建了一个示例,简短的代码,您可以在其中确切地看到问题所在 from threading import Thread, active_count import time def func(x): time.sleep(x) print(active_count()) print(active_count()) t = Thread(target=func, name="thread", args=(5,)) t.start() print

我有一个很长的程序,里面有很多线程。我创建了一个示例,简短的代码,您可以在其中确切地看到问题所在

from threading import Thread, active_count
import time

def func(x):
    time.sleep(x)
    print(active_count())

print(active_count())
t = Thread(target=func, name="thread", args=(5,))
t.start()
print("main thread finished")
简单地说,我不明白为什么主线程在执行最后一个print语句后仍然处于活动状态

  • 我定义了一个函数func
  • 第一个print语句打印数字1—活动线程的数量。由于线程t尚未激活,因此编号1正确(仅主线程)
  • 我定义了线程t并执行它
  • 当线程t休眠时,主线程完成了最后一条打印语句,应该完成 但是
  • 线程t被唤醒并打印当前活动线程的数量-该数量为2-主线程和线程t(根据python)都处于活动状态,即使主线程应该已经完成,因此不应该再处于活动状态,因为它已经打印了最后一行(最后的打印语句)

  • 请有人给我解释一下为什么会这样,主线程和其他线程之间的机制是什么?谢谢你

    你必须习惯像C这样的编译语言,退出主例程会毁掉一切

    在Python中,到达主线程的末尾不会破坏其他线程

    事实上,您无法真正销毁线程,这必须是一项协作任务(例如:设置标志或发送事件以便线程理解它必须退出其循环:在您的情况下,您可能需要分段
    时间.sleep()
    并检查其间的标志,以便在需要时从线程返回)

    因此,当主线程结束执行时,python解释器将等待所有线程完成,然后退出


    请注意,最好使用
    join
    方法(
    t.start()
    )具体化此等待。

    要实现所需的功能,需要在启动线程之前将其标记为守护进程:

    t = Thread(...)
    t.daemon = True
    t.start()
    
    见文件:

    线程可以标记为“守护线程”。此标志的意义在于,当只剩下守护进程线程时,整个Python程序将退出


    主线程不是守护进程,因此将生成的线程标记为守护进程可以让您在主线程结束后立即退出程序。

    不,主线程会等待所有线程完成,即使您没有使用join。