標籤:color 無法 one 處理 效能測試 def gif 多個 互斥鎖
一:GIL全域解譯器鎖介紹
在CPython中,全域解譯器鎖(或GIL)是一個互斥鎖, 它阻止多個本機線程同時執行Python位元組碼。譯文:之所以需要這個鎖, 主要是因為CPython的記憶體管理不是安全執行緒的。(然而,由於GIL的存在, 其他特性已經變得依賴於它所執行的保證。)
1. 什麼是GIL全域解譯器鎖
GIL本質就是一把互斥鎖,相當於執行許可權,每個進程內都會存在一把GIL,同一進程內的多個線程必須搶到GIL之後才能使用Cpython解譯器來執行自己的代碼,即同一進程下的多個線程無法實現並行但是可以實現並發在Cpython解譯器下,如果想實現並行可以開啟多個進程
2. 為何要有GIL
因為Cpython解譯器的記憶體回收機制不是安全執行緒的
3. 如何用GIL
有了GIL,應該如何處理並發
from threading import Threadimport timedef task(name): print(‘%s is running‘ %name) time.sleep(2)if __name__ == ‘__main__‘: t1=Thread(target=task,args=(‘線程1‘,)) t2=Thread(target=task,args=(‘線程1‘,)) t3=Thread(target=task,args=(‘線程1‘,)) t1.start() t2.start() t3.start()
View Code
二:多線程效能測試
from multiprocessing import Processfrom threading import Threadimport os,timedef work(): res=0 for i in range(100000000): res*=iif __name__ == ‘__main__‘: l=[] print(os.cpu_count()) start=time.time() for i in range(6): # p=Process(target=work) p=Thread(target=work) l.append(p) p.start() for p in l: p.join() stop=time.time() print(‘run time is %s‘ %(stop-start)) #4.271663427352905
計算密集型:應該使用多進程
from multiprocessing import Processfrom threading import Threadimport threadingimport os, timedef work(): time.sleep(2)if __name__ == ‘__main__‘: l = [] start = time.time() for i in range(300): # p=Process(target=work) #2.225289821624756 p = Thread(target=work) # 2.002105951309204 l.append(p) p.start() for p in l: p.join() stop = time.time() print(‘run time is %s‘ % (stop - start))
IO密集型: 應該開啟多線程
Python 36 GIL全域解譯器鎖