守护进程

守护进程

主进程创建守护进程 
  其一:守护进程会在主进程代码执行结束后就终止 
  其二:守护进程内无法再开启子进程,否则抛出异常: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
View Code

原因是:主进程程序启动执行到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
View Code

 主线程A中,创建了子线程B,并且在主线程A中调用了B.setDaemon(),这个的意思是,把主线程A设置为守护线程,这时候,要是主线程A执行结束了,就不管子线程B是否完成,一并和主线程A退出.这就是setDaemon方法的含义,这基本和join是相反的。此外,还有个要特别注意的:必须在start() 方法调用之前设置,如果不设置为守护线程,程序会被无限挂起。

  

posted @ 2018-07-14 00:11  耐烦不急  阅读(319)  评论(0编辑  收藏  举报