GIL 全域性直譯器鎖

2021-09-28 21:35:25 字數 1104 閱讀 8188

對gil的理解

每個執行緒在執行的過程中都需要先獲取gil,保證同一時刻只有乙個執行緒可以執行**;

多程序和多執行緒

因為gil的問題導致系統中同一時間點只能有乙個執行緒被直譯器解釋,這就導致了執行緒無法實現並行,無法充分的利用我們

計算機的多核 資源,python所謂的多執行緒程式設計就類似於單核cpu情況下的多程序程式設計。

相比之下多程序下每個程序執行的時候都會建立乙個直譯器,所以就能夠比較好的計算機的多和資源實現並行。

什麼時候會釋放gil鎖

1. 遇到像 i/o操作這種 會有時間空閒情況 造成cpu閒置的情況會釋放gil

2. 會有乙個專門ticks進行計數 一旦ticks數值達到100 這個時候釋放gil鎖 執行緒之間開始競爭gil鎖(說明:

ticks這個數值可以進行設定來延長或者縮減獲得gil鎖的執行緒使用cpu的時間)

互斥鎖和gil鎖的關係

gil鎖  : 保證同一時刻只有乙個執行緒能使用到cpu

互斥鎖 : 多執行緒時,保證修改共享資料時有序的修改,不會產生資料修改混亂

協程

協程又叫微執行緒,簡單點說協程是程序和執行緒的公升級版,程序和執行緒都面臨著核心態和使用者態的切換問題而耗費許多切換時間,

而協程就是 使用者自己控制切換的時機,不再需要陷入系統的核心態.

python裡最常見的yield就是協程的思想!

小總結

1. gil只對python中的執行緒有影響

2. 在io操作等可能會引起阻塞的system call之前,可以暫時釋放gil,但在執行完畢之後,必須重新獲取gil;

3. python使用多程序可以利用多核cpu資源;python使用多執行緒實際上只是利用了乙個核;

4. 在編寫乙個多執行緒抓取網頁的程式時,比單執行緒效能會有所提公升,原因是遇到io阻塞時會自動釋放gil鎖;

5. 對於計算密集型程式,用程序;對於io密集型(u盤及檔案的讀寫,網路的收與發)程式,用執行緒或者協程

GIL 全域性直譯器鎖

1 描述python中gil的概念,以及它對python多執行緒的影響?編寫乙個多執行緒抓取網頁的程式,並闡明多執行緒抓取程式是否可比單執行緒效能有提公升,並解釋原因。答 gil global interpreter lock,即全域性直譯器鎖 1 python語言和gil沒有半毛錢關係。僅僅是由於...

GIL全域性直譯器鎖

gil 啥?他是如何產生的?gil產生的背景 在cpython解釋內部執行多個執行緒的時候,每個執行緒都需要直譯器內部申請相應的全域性資源,由於c語言本身比較底層造成cpython在管理所有全域性資源的時候並不能應對所有執行緒同時的資源請求,因此為了防止資源競爭而發生錯誤,對所有執行緒申請全域性資源...

全域性直譯器鎖GIL

我們使用高併發,一次是建立1萬個執行緒去修改乙個數並列印結果看現象 from threading import thread import osdef func args global n n args print n,os.getpid n 100t list for i in range 100...