11月1日守护线程

发布时间 2023-11-01 16:18:56作者: songjunwan

守护线程

守护线程核心就是守护到整个进程运行周期结束

什么是进程的运行周期呢?

进程的运行周期通常以循环的方式重复进行,从就绪状态到运行状态再到阻塞状态,然后再次切换到就绪状态。这个循环持续进行,一直到进程结束。

第一种情况只有主线程和守护线程的情况

这个情况就是为了测试守护线程是否和守护进程一样,当主线程结束守护线程是否会结束

代码

# 守护线程,守护的是进程的运行周期

from threading import Thread, enumerate
import time

def task():
    print('守护线程开始')
    time.sleep(10)
    print('守护线程结束')


if __name__ == '__main__':
    t = Thread(target=task)
    t.daemon = True#这里将t这个线程变成守护线程
    t.start()
    print('主')

结果如图

结果证明了主线程结束,子线程也会立刻停止运行

第二种情况有主线程、子线程以及守护线程的情况

现在要证明的是在主线程完成后,子线程还在运行时守护线程会不会随着主线程结束

代码

from threading import Thread, enumerate
import time

def task():
    print('守护线程开始')
    time.sleep(3)#这里让守护线程睡眠3秒,这个期间让主线程结束掉然后看看守护线程会不会结束
    print('守护线程结束')


def task2():
    print('子线程start')
    time.sleep(4)#这里让子线程比守护线程多睡眠一秒确保这个时间里面守护线程结束
    print('子线程end')

if __name__ == '__main__':
    t = Thread(target=task)
    t2 = Thread(target=task2)

    t.daemon = True#这里将t这个线程变成守护线程
    t2.start()

    t.start()
    print('主')

结果如下

结果图就说明了当有子线程时,主线程结束了守护线程不会结束,如果守护线程比子线程多睡眠一秒它就会因为子线程结束而结束

总结

守护线程的结束条件是整个进程运行周期结束

现在以生活为例子

假设我有一个餐厅(代表一个进程),里面有一个服务员(代表一个守护线程),然后有餐厅老板(代表一个主线程),以及顾客(子线程)

进程(餐厅):它运行着并提供服务,主线程(餐厅老板)负责管理餐厅的整体运营。老板负责开店、关店以及处理一些餐厅运营相关的任务。子线程(服务员)负责接受客户的点餐以及上菜,如果主线程(老板)有事离开,但是它让守护线程(服务员)等子线程(顾客)结束了把门关了,守护线程(服务员)可以等待子线程(顾客)结束了把门关了,也可以比顾客先走,取决于它的工作时间。

在这个例子中,服务员线程是一个守护线程,它等待接受顾客的点餐请求,但当餐厅关闭时,服务员也会关闭。主线程(餐厅老板)管理餐厅的整体运营,可以随时开店、关闭店以及执行其他任务。但是当主线程(餐厅老板)提前离去,顾客没有走服务员就有可能要等待顾客走了再走,也可以比顾客先走取决于它的工作时间。