浅谈守护线程之setDaemon方法

守护线程—setDaemon方法

一、什么是线程?

了解线程的前提让我们先来说一下进程与线程之间的关系。

1.一个程序至少由一个进程,一个进程至少有一个线程,
进程可以理解为线程的容器,没有进程,线程是不可能单独存在的。
2.一个进程也至少有一个线程,因为线程是进程的一个实体,最小的执行单位。好比一个工厂中,进程是一条生产线,那么生产线上的工人就是线程,有几个工人就是这个进程有几个线程。
3.进程在执行过程中拥有独立的内存单元,而多个线程共享这个进程内存的单元,因为进程是最小的资源单位,所以操作系统最多把资源分给进程,不可能把资源分给线程

线程是是操作系统能够进行运算调度的最小单位。

二、什么是守护线程?

守护线程就是不管这个子线程是否结束,都会和主线程一起退出。
setDaemon(True)方法就是设置子线程为守护线程。

例1`

def ha(num):
    time.sleep(3)
    print('哈哈%d' % num)
    print('咳咳咳')`
    
if __name__ == '__main__':
    t1 = threading.Thread(target=ha,args=(10,))#创建了一个线程对象
    t1.start()
	print('啦啦')

这个代码,是正常输出,那么我们看一下下面的例子

例2

def ha(num):
    time.sleep(3)
    print('哈哈%d' % num)
    print('咳咳咳')
def xi():
    time.sleep(5)
    print('嘻嘻')
 
    
if __name__ == '__main__':
    t1 = threading.Thread(target=ha,args=(10,))#创建了一个线程对象
    t1.start()
    
	t2 = threading.Thread(target=xi)
    t2.setDaemon(True)  # 设置t1为守护线程,会跟随主线程的结束而结束
    t2.start()
    print('啦啦')

从结果上,会先打印 ‘啦啦’,然后t1和t2线程一同执行结束,为什么会这样呢?

因为,在默认的情况下,主线程会等待所有子线程结束才会结束

所以,上面的代码的情况就是:
t2设置为守护线程,会跟随主线程一起结束,而t1不是守护线程,主线程会等待t1执行完再结束。所以,上面就变成了,主线程、守护子线程、非守护子线程都一起结束。

再增加一下说服力:
请看代码:

def ha(num):
    time.sleep(3)
    print('哈哈%d' % num)
    print('咳咳咳')
def xi():
    time.sleep(5)
    print('嘻嘻')
 
    
if __name__ == '__main__':
    t1 = threading.Thread(target=ha,args=(10,))#创建了一个线程对象
    t1.start()
    t1.setDaemon(True)
    
	t2 = threading.Thread(target=xi)
    t2.setDaemon(True)  # 设置t1为守护线程,会跟随主线程的结束而结束
    t2.start()
    print('啦啦')

这样,我们就会发现我们的程序只会打印一个 ‘啦啦’。

强调一下:setDaemon方法必须要在开启线程(star方法)之前,
因为运行中线程是不能设置为守护线程的。

希望能为您带来帮助,共勉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值