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掉,就全部退出。

 

posted @ 2017-07-29 20:02  帅丶高高  阅读(208)  评论(0编辑  收藏  举报