1. 程式人生 > >GIL

GIL

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)


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)
IO密集測試(多線程效率高)

GIL與自定義互斥鎖的區別:

GIL只能保證解釋器代碼的數據的安全,要想保證開啟的線程安全必須加互斥鎖

GIL