守护进程
守护进程
主进程创建守护进程
其一:守护进程会在主进程代码执行结束后就终止
其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to have children
注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止
# 守护进程 import threading import time def run(n): print('task',n) time.sleep(2) print('task done',n)#从结果中可以看出这步没执行,所以主进程执行完毕,那么守护子进程i也就被干掉了 start_time=time.time() for i in range(50): t= threading.Thread(target=run,args=('t-%s'%i,)) t.setDaemon(True)#把当前线程设置为守护进程,一定在start之前设置,start之后就不可以设置了。 t.start() print('主线程不是守护进程,主线程是程序本身,' '程序会等主线程执行完毕,但是不会等守护进程执行完毕')#主线程 print('非守护进程执行结束后,程序立刻同时结束,不会等守护线程,' '看一下时间就知道:',time.time()-start_time)
结果:
1 守护进程 2 主进程创建守护进程 3 其一:守护进程会在主进程代码执行结束后就终止 4 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to have children 5 6 注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止 7 8 # 守护进程 9 import threading 10 import time 11 def run(n): 12 print('task',n) 13 time.sleep(2) 14 print('task done',n) 15 start_time=time.time() 16 for i in range(50): 17 t= threading.Thread(target=run,args=('t-%s'%i,)) 18 t.setDaemon(True)#把当前线程设置为守护进程,一定在start之前设置,start之后就不可以设置了。 19 t.start() 20 21 print('主线程不是守护进程,主线程是程序本身,' 22 '程序会等主线程执行完毕,但是不会等守护进程执行完毕')#主线程 23 24 print('非守护进程执行结束后,程序立刻同时结束,不会等守护线程,' 25 '看一下时间就知道:',time.time()-start_time) 26 结果: 27 28 1 task t-0 29 2 task t-1 30 3 task t-2 31 4 task t-3 32 5 task t-4 33 6 task t-5 34 7 task t-6 35 8 task t-7 36 9 task t-8 37 10 task t-9 38 11 task t-10 39 12 task t-11 40 13 task t-12 41 14 task t-13 42 15 task t-14 43 16 task t-15 44 17 task t-16 45 18 task t-17 46 19 task t-18 47 20 task t-19 48 21 task t-20 49 22 task t-21 50 23 task t-22 51 24 task t-23 52 25 task t-24 53 26 task t-25 54 27 task t-26 55 28 task t-27 56 29 task t-28 57 30 task t-29 58 31 task t-30 59 32 task t-31 60 33 task t-32 61 34 task t-33 62 35 task t-34 63 36 task t-35 64 37 task t-36 65 38 task t-37 66 39 task t-38 67 40 task t-39 68 41 task t-40 69 42 task t-41 70 43 task t-42 71 44 task t-43 72 45 task t-44 73 46 task t-45 74 47 task t-46 75 48 task t-47 76 49 task t-48 77 50 task t-49 78 51 主线程不是守护进程,主线程是程序本身,程序会等主线程执行完毕,但是不会等守护进程执行完毕 79 52 非守护进程执行结束后,程序立刻同时结束,不会等守护线程,看一下时间就知道: 0.013000726699829102
原因是:主进程程序启动执行到t-i子进程,由于子进程需要开辟内存空间,由于需要耗费时间,所以主进程会首先输出“主”,由于主进程执行完毕,那么守护子进程i也就被干掉了,随之主进程也就退出了
# 守护进程 import threading import time def run(n): print('task',n) time.sleep(2) print('task done',n) start_time=time.time() for i in range(50): t= threading.Thread(target=run,args=('t-%s'%i,)) t.setDaemon(True) t.start() time.sleep(2) print('如果主线程时间消耗长一点,子线程会有执行的结果显示,有可能子线程执行完,也有可能没执行完如下:' '看一下时间就知道:',time.time()-start_time)
结果:
1 task t-0 2 task t-1 3 task t-2 4 task t-3 5 task t-4 6 task t-5 7 task t-6 8 task t-7 9 task t-8 10 task t-9 11 task t-10 12 task t-11 13 task t-12 14 task t-13 15 task t-14 16 task t-15 17 task t-16 18 task t-17 19 task t-18 20 task t-19 21 task t-20 22 task t-21 23 task t-22 24 task t-23 25 task t-24 26 task t-25 27 task t-26 28 task t-27 29 task t-28 30 task t-29 31 task t-30 32 task t-31 33 task t-32 34 task t-33 35 task t-34 36 task t-35 37 task t-36 38 task t-37 39 task t-38 40 task t-39 41 task t-40 42 task t-41 43 task t-42 44 task t-43 45 task t-44 46 task t-45 47 task t-46 48 task t-47 49 task t-48 50 task t-49 51 task done t-0 52 task done t-1 53 task done t-4 54 task done t-2 55 task done t-6 56 task done t-7 57 task done t-5 58 task done t-3 59 task done t-10 60 task done t-9 61 task done t-8 62 task done t-14 63 task done t-11 64 task done t-12 65 task done t-13 66 task done t-16 67 task done t-15 68 task done t-17 69 task done t-18 70 task done t-22 71 task done t-20 72 task done t-23 73 task done t-19 74 task done t-21 75 task done t-29 76 task done t-28 77 task done t-31 78 task done t-27 79 task done t-25 80 task done t-30 81 task done t-24 82 task done t-32 83 task done t-36 84 task done t-26 85 task done t-33 86 task done t-34 87 task done t-35 88 task done t-39 89 task done t-41 90 task done t-38 91 task done t-40 92 task done t-37 93 task done t-46 94 task done t-45 95 task done t-43 96 task done t-44 97 task done t-42 98 task done t-49 99 task done t-48 100 task done t-47 101 如果主线程时间消耗长一点,子线程会有执行的结果显示,有可能子线程执行完,也有可能没执行完如下:看一下时间就知道: 2.010115146636963task
主线程A中,创建了子线程B,并且在主线程A中调用了B.setDaemon(),这个的意思是,把主线程A设置为守护线程,这时候,要是主线程A执行结束了,就不管子线程B是否完成,一并和主线程A退出.这就是setDaemon方法的含义,这基本和join是相反的。此外,还有个要特别注意的:必须在start() 方法调用之前设置,如果不设置为守护线程,程序会被无限挂起。