05-线程-守护线程

目标

  • 能够使用setDaemon 设置子线程守护主线程

1. 守护线程

守护线程:如果在程序中将子线程设置为守护线程,则该子线程会在主线程结束时自动退出,设置方式为thread.setDaemon(True),要在thread.start()之前设置,默认是false的,也就是主线程结束时,子线程依然在执行。

对于python应用我们都知道main方法是入口,它的运行代表着主线程开始工作了,我们也知道Python虚拟机里面有垃圾回收器的存在使得我们放心让main飞奔,然而这背后的故事是垃圾回收线程作为守护着主线程的守护线程默默的付出着。

image-20180613162706549

image-20180907234815571

如下代码,主线程已经exit() 【其实并没有真正结束】,子线程还在继续执行

import threading
import time


def work1():

    for i in range(10):
        print("正在执行...", i)
        time.sleep(0.5)


if __name__ == '__main__':
    #

    # 创建子线程
    t1 = threading.Thread(target=work1)
    # 设置子线程 t1 为守护线程
    t1.setDaemon(True)
    # 启动子线程
    t1.start()

    # 睡2秒
    time.sleep(2)
    print("Game Over")
    # 让程序退出
    # 当主线程睡眠2秒,开始结束字节的时候,但是子线程还没有结束,默认情况下,子线程继续执行
    # exit() 退出无效
    # 如果想让主线程结束的时候,没有执行完成的子线程也一起结束,这就是 线程守护
    exit()

image-20180613221004462

2. 设置守护线程

# 设置为守护线程(如果主线程结束了,也随之结束)
线程.setDaemon(True)
image-20180613221243443