1.开启线程的两种方式:
进程,线程:
进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合)而线程才是cpu上的执行单位)
1.同一个进程内的多个线程共享该进程内的地址资源
2.创建线程的开销远小于创建进程的开销(创建一个进程,就是创建一个车间,涉及到申请空间,
而且在该空间内建至少一条流水线,但创建线程,就只是在一个车间内造一条流水线,无需申请空间,所以创建开销小)
1 # 方式1:
2 from threading import Thread
3 import time
4
5 def sayhi(name):
6 time.sleep(2)
7 print('%s say hello'%name)
8
9 if __name__ == "__main__":
10 t=Thread(target=sayhi,args=('alice',))
11 t.start()
12 print('主线程') # 一个进程,一个主线程,开启了一个线程
13
14 # 方式2:
15 from threading import Thread
16 import time
17
18 class Sayhi(Thread):
19 def __init__(self,name):
20 super().__init__()
21 self.name = name
22
23 def run(self):
24 time.sleep(2)
25 print('%s say hello'%self.name)
26
27 if __name__ == "__main__":
28 t = Sayhi('alice')
29 t.start()
30 print('主线程')
2.进程与线程的区别:
1.开进程的开销远大于开线程
2.同一进程内的多个线程共享该进程的地址空间
3.瞅一眼pid
1 # 1.
2 import time
3 from threading import Thread
4 from multiprocessing import Process
5
6 def piao(name):
7 print('%s piaoing' %name)
8 time.sleep(2)
9 print('%s piao end' %name)
10
11 if __name__ == '__main__':
12 # p1=Process(target=piao,args=('egon',))
13 # p1.start() # 发出去后,没有立刻反应 开进程开销大
14
15 t1=Thread(target=piao,args=('egon',))
16 t1.start() # 发出去后,立刻就反应了,开线程开销小
17
18 print('主线程')
19 """
20 主线程
21 egon piaoing
22 egon piao end
23 """
24 """
25 egon piaoing
26 主线程
27 egon piao end
28 """
29 # 2.
30 from threading import Thread
31 from multiprocessing import Process
32
33 n=100
34 def task():
35 global n
36 n=0
37
38 if __name__ == '__main__':
39 # p1=Process(target=task)
40 # p1.start()
41 # p1.join() # 彼此隔离的 n = 100
42
43 t1=Thread(target=task)
44 t1.start()
45 t1.join() # 共享地址空间 n = 0
46
47 print('主线程',n)
48 """
49 主线程 100
50 """
51 """
52 主线程 0
53 """
54 # 3.
55 from threading import Thread
56 from multiprocessing import Process,current_process
57 import os
58
59 def task():
60 print(current_process().pid)
61 print(os.getpid(),os.getppid())
62
63 if __name__ == '__main__':
64 # p1=Process(target=task)
65 # p1.start() # pid 不一样
66 # p1.join()
67
68 t1=Thread(target=task)
69 t1.start() # 线程pid 一样
70 t1.join()
71
72 print('主线程',current_process().pid)
73 print('主线程',os.getpid(),os.getppid())
74 """
75 38780
76 38780 43168
77 主线程 43168
78 主线程 43168 12480
79 """
80 """
81 58912
82 58912 12480
83 主线程 58912
84 主线程 58912 12480
85 """
3.Thread对象的其他属性或方法:
currentThread().getName()
t.setName()
t.is_alive()
t.isAlive()
t.join()
active_count()
enumerate()
1 from threading import Thread,currentThread,active_count,enumerate
2 import time
3
4 def task():
5 print('%s is running'%currentThread().getName())
6 time.sleep(2)
7 print('%s is done'%currentThread().getName())
8
9 if __name__ == "__main__":
10 t = Thread(target=task,name='子线程1')
11 t.start()
12 # t.join()
13 # print(t.getName())
14 # t.setName('儿子线程1')
15 # currentThread().setName('主进程')
16 # print(t.is_alive())
17 # print(t.isAlive())
18 # print('主线程:',currentThread().getName())
19 t.join()
20 # print(active_count()) # 2 没有join 1 有join
21 print(enumerate()) # [<_MainThread(MainThread, started 41144)>]
22
23
24 """
25 Thread-1 is running
26 Thread-1
27 主线程 MainThread
28 Thread-1 is done
29 """
30 """
31 子线程1 is running
32 子线程1
33 主线程 MainThread
34 子线程1 is done
35 """
36 """
37 子线程1 is running
38 主线程 MainThread
39 儿子线程1 is done
40 """
41 """
42 子线程1 is running
43 主线程: 主进程
44 子线程1 is done
45 """
46 """
47 子线程1 is running
48 子线程1 is done
49 False
50 False
51 主线程: MainThread
52 """
4.守护线程:
一个进程什么时候被销毁,
1.不开线程,代码完毕,该进程就被销毁
2.主线程等到所有子线程死了后,他才死
守护线程等到所有的子线程死了后,他才死
1 from threading import Thread
2 import time
3
4 def sayhi(name):
5 time.sleep(2)
6 print('%s say hello' %name)
7
8 if __name__ == '__main__':
9 t=Thread(target=sayhi,args=('egon',))
10 # t.setDaemon(True) #必须在t.start()之前设置
11 t.daemon=True
12 t.start()
13
14 print('主线程')
15 print(t.is_alive()) # t 跟着死了 一个线程内没有开启非守护线程
16 """
17 主线程
18 True
19 """
20
21 from threading import Thread
22 import time
23
24 def foo():
25 print(123)
26 time.sleep(4)
27 print("end123")
28
29 def bar():
30 print(456)
31 time.sleep(3)
32 print("end456")
33
34 if __name__ == '__main__':
35 t1=Thread(target=foo)
36 t2=Thread(target=bar)
37
38 t1.daemon=True
39 t1.start()
40 t2.start()
41 print("main-------")
42 """
43 123 foo time.sleep(1)
44 456
45 main-------
46 end123
47 end456
48 """
49 """
50 123 foo time.sleep(4)
51 456
52 main-------
53 end456
54 """