守护线程—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方法)之前,
因为运行中线程是不能设置为守护线程的。
希望能为您带来帮助,共勉。