53_並發編程-線程-GIL鎖
阿新 • • 發佈:2018-10-30
sof 文件 不能 name ESS 並發編程 sed web soft 一、GIL - 全局解釋器鎖
有了GIL的存在,同一時刻同一進程中只有一個線程被執行;由於線程不能使用cpu多核,可以開多個進程實現線程的並發,因為每個進程都會含有一個線程,每個進程都有自己的GIL鎖。
① py文件產生了多個線程,到達解釋器 ② 由於GIL鎖問題,所以只能執行一個線程,先調用一個線程,進行編譯器編譯成 .pyc字節碼 ③ 字節碼進入虛擬機形成機器碼 ④ 機器碼由cpu執行 二、性能測試 多進程和多線程對應I/O 純計算效率對比
1 import time
2 from multiprocessing import Process
3 from threading import Thread
4
5 # def func():
6 # num = 0
7 # for i in range(1,100000000):
8 # num += i
9
10 def func():
11 time.sleep(2)
12 print(‘xxxxxxxx‘)
13
14 if __name__ == ‘__main__‘:
15 p_s_t = time.time()
16 p_list = []
17 for i in range(10):
18 p = Process(target=func,)
19 p_list.append(p)
20 p.start()
21 [pp.join() for pp in p_list]
22 p_e_t = time.time()
23 p_dif_t = p_e_t - p_s_t
24
25 t_s_t = time.time()
26 t_list = []
27 for i in range(10):
28 t = Thread(target=func,)
29 t_list.append(t)
30 t.start()
31 [tt.join() for tt in t_list]
32 t_e_t = time.time()
33 t_dif_t = t_e_t - t_s_t
34
35 print(‘多進程執行的時間‘,p_dif_t)
36 print(‘多線程執行的時間‘,t_dif_t)
View Code
三、總結
應用:
多線程用於IO密集型,如socket,爬蟲,web
多進程用於計算密集型,如金融分析
53_並發編程-線程-GIL鎖