day9-守护线程
一、前言
我们说在不加join的时候,主线程和子线程完全是并行的,没有了依赖关系,你主线程执行了,我子线程也执行了。但是加了join之后,主线程依赖子线程执行完毕才往下走。现在我们要把所有的子线程编程我的守护进程。
守护进程:说白了,你是主人,你搞了几个仆人,这些个仆人都是为你服务的。可以帮你做很多事情,一个主人可以有多个守护进程,它们为你服务的前提是,主线程必须存在,如果主线程不存在,则守护进程也没了。那守护进程是干嘛的呢?帮你管理一些资源,打开一些文件,监听一些端口,监听一些资源,把一些垃圾资源会后,它可以干很多事情,这些完全定义,你想干嘛干嘛。
二、知识补充
2.1、查看当前线程和统计活动线程个数
说明:用theading.current_thead()查看当前线程;用theading.active_count()来统计当前活动的线程数
import threading,time def run(n): print("task:",n) time.sleep(2) print("task done",n,threading.current_thread()) #查看每个子线程 start_time = time.time() for i in range(5): t = threading.Thread(target=run,args=("t-{0}".format(i),)) t.start() print("--------all thead has finished",threading.current_thread(),threading.active_count())#查看主线程和当前活动的所有线程数 print("cost:",time.time()-start_time) #输出 task: t-0 task: t-1 task: t-2 task: t-3 task: t-4 --------all thead has finished <_MainThread(MainThread, started 3840)> 6 cost: 0.0019359588623046875 task done t-0 <Thread(Thread-1, started 11536)> task done t-3 <Thread(Thread-4, started 10480)> task done t-2 <Thread(Thread-3, started 11008)> task done t-4 <Thread(Thread-5, started 5088)> task done t-1 <Thread(Thread-2, started 2464)>
注意:线程个数=子线程数+主线程数
三、守护线程
只要主线程执行完毕,它不管子线程有没有执行完毕。就退出了。所以我现在就可以把所有的子线程变成所有的守护线程。变成守护线程之后,主程序就不会等子线程结束载退出了。它会等待非守护线程执行完毕才退出。所以不用管这些守护线程,守护线程是仆人,不重要,主线程不管的。
3.1、守护线程设置
说明:用setDaemon(True)来设置守护线程
import threading,time def run(n): print("task:",n) time.sleep(2) print("task done",n) start_time = time.time() for i in range(5): t = threading.Thread(target=run,args=("t-{0}".format(i),)) t.setDaemon(True) #Daemon意思是进程,这边是把当前线程设置为守护线程 t.start() print("--------all thead has finished") print("cost:",time.time()-start_time) #输出 task: t-0 task: t-1 task: t-2 task: t-3 task: t-4 --------all thead has finished cost: 0.0019998550415039062
注意了:守护进程一定要在start之前设置,start之后就不能设置了,之后设置会报错,所以必须之前设置。从上面可以看出,主线程是执行完毕,但是不会等守护线程执行完毕。
3.2、使用场景
比如你写一个socket_server,每一个链接过来,socket_server就会给这个链接分配一个新的线程。如果我手动的把socket_server停掉。那这种情况你必须手动停掉服务,那它就要down了,这种情况下还要等线程结束吗?就不用等线程结束了,它自己就直接结束了。这样,是不是就可以把每个socket线程设置一个守护线程。主线程一旦down掉,就全部退出。