GIL
阿新 • • 發佈:2018-11-13
b- range print sta port 測試 spl one 定義
GIL(Global Interpreter Look):全局解釋器鎖,為了避免線程競爭資源造成數據錯亂。
其實每個py程序都必須有解釋器參加,解釋器就是一堆代碼,就等於多線程要競爭同一個解釋器的代碼,所以要給解釋器加互斥鎖。而且除了自己開的線程,還有用於垃圾回收的系統線程等,所以必須加鎖
加鎖以後,就意味著線程只能並發,同一時間只有一個cpu在處理線程,看起來效率很低,其實是要看cpu是用來做計算還是用來做io操作的。
如果是在io密集的程序中,cpu性能無法直接決定程序的執行速度。在計算密集的程序中,cpu的性能可以直接決定程序的執行速度。
from threading import計算密集測試(多進程效率高)Thread from multiprocessing import Process import time def task1(): sum = 1 for i in range(10000000): sum *= i def task2(): sum = 1 for i in range(10000000): sum *= i def task3(): sum = 1 for i in range(10000000): sum *= i if __name__ == ‘__main__‘: # 開始時間 st_time = time.time() t1= Process(target=task1) t2 = Process(target=task2) t3 = Process(target=task3) t1.start() t2.start() t3.start() t1.join() t2.join() t3.join() print(time.time()-st_time)
from threading import Thread import time def task1(): time.sleep(3)IO密集測試(多線程效率高)def task2(): time.sleep(3) def task3(): time.sleep(3) # 開始時間 st_time = time.time() t1 = Thread(target=task1) t2 = Thread(target=task2) t3 = Thread(target=task3) t1.start() t2.start() t3.start() t1.join() t2.join() t3.join() print(time.time() - st_time)
GIL與自定義互斥鎖的區別:
GIL只能保證解釋器代碼的數據的安全,要想保證開啟的線程安全必須加互斥鎖
GIL