GIL與池的定義問答

2022-06-17 05:12:09 字數 1450 閱讀 6121

"""

1、整理gil直譯器鎖,解釋以下問題

1、什麼是gil

是cpython中的全域性直譯器鎖,是一種互斥鎖,是為了防止多個本地執行緒

同一時間執行python位元組碼

2、有了gil會對單程序下的多個執行緒造成什麼樣的影響

造成多執行緒不能並行執行

3、為什麼要有gil

因為cpython的記憶體管理是非執行緒安全的,然而gil尤其存在的必要性可以防止

多個本地執行緒同一時間執行python位元組碼,同時已經存在很多**需要依賴這個鎖了

4、gil與自定義互斥鎖的區別,多個執行緒爭搶gil與自定義互斥鎖的過程分析

他們都是互斥鎖,但gil是加在python直譯器上的,只能鎖住直譯器內部的資源,但無法鎖住我們

自己開啟的資源、自己開啟的共享資源還需要自己鎖

但例如申請記憶體,儲存資料等等就不需要我們程式設計師自己考慮了,gil已經搞定了

5、什麼時候用python的多執行緒,什麼時候用多程序,為什麼?

如果是io密集時使用多執行緒如果時計算密集時使用多程序

""""""

2、程序池與執行緒池

1、池的用途,為何要用它

池時乙個容器,執行緒池就是裝執行緒的容器,

可以使用它來管理執行緒的開啟與銷毀

自動分配任務給空閒的執行緒

可以控制線程開啟的數量,保證系統的穩定

2、池子裡什麼時候裝程序什麼時候裝執行緒?

"""

熟悉python的都知道,在c語言寫的python直譯器中存在全域性直譯器鎖,由於全域性直譯器鎖的存在,在同一時間內,python直譯器只能執行乙個執行緒的**,這大大影響了python多執行緒的效能。而這個直譯器鎖由於歷史原因,現在幾乎無法消除。

python gil 之所以會影響多執行緒等效能,是因為在多執行緒的情況下,只有當執行緒獲得了乙個全域性鎖的時候,那麼該執行緒的**才能執行,而全域性鎖只有乙個,所以使用python多執行緒,在同一時刻也只有乙個執行緒在執行,因此在即使在多核的情況下也只能發揮出單核的效能。

既然python在同一時刻下只能執行乙個執行緒的**,那執行緒之間是如何排程的呢? 

對於有io操作的執行緒,當乙個執行緒在做io操作的時候,因為io操作不需要cpu,所以,這個時候,python會釋放python全域性鎖,這樣其他需要執行的執行緒就會使用該鎖。 

對於cpu密集型的執行緒,比如乙個執行緒可能一直需要使用cpu做計算,那麼python中會有乙個執行指令的計數器,當乙個執行緒執行了一定數量的指令時,該執行緒就會停止執行並讓出當前的鎖,這樣其他的執行緒就可以執行**了。 

由上面可知,至少有兩種情況python會做執行緒切換,一是一但有io操作時,會有執行緒切換,二是當乙個執行緒連續執行了一定數量的指令時,會出現執行緒切換。當然此處的執行緒切換不一定就一定會切換到其他執行緒執行,因為如果當前執行緒 優先順序比較高的話,可能在讓出鎖以後,又繼續獲得鎖,並優先執行。

在做科學計算的時候是用的單執行緒,因為這種計算是需要cpu一直做計算的,如果用多執行緒反而會降低計算速度。

執行緒,執行緒安全與python的GIL鎖

今天看到一篇文章,講述的是幾個提公升python效能的專案 傳送門 在看的過程中,接觸到乙個名詞,乙個從學python開始就一直看到,但是從來都是一知半解的名詞,心裡不開心,必須把它搞明白,對了,這個詞就是 gil。網上搜尋了一些資料,粗淺的理解了什麼是gil,自己感覺學習的過程比較好,感覺略有收穫...

RAW裝置與ORACLE的問答

1 什麼叫做裸裝置?裸裝置,也叫裸分割槽 原始分割槽 是一種沒有經過格式化,不被unix通過檔案系統來讀取的特殊字元裝置。它由應用程式負責對它進行讀寫操作。不經過檔案系統的緩衝。2 如何辨別裸裝置?在unix的 dev 目錄下,有許多檔案,其中有兩個大類 字元裝置檔案和塊裝置檔案。字元裝置特殊檔案進...

RAW裝置與ORACLE的問答

1 什麼叫做裸裝置?裸裝置,也叫裸分割槽 原始分割槽 是一種沒有經過格式化,不被unix通過檔案系統來讀取的特殊字元裝置。它由應用程式負責對它進行讀寫操作。不經過檔案系統的緩衝。2 如何辨別裸裝置?在unix的 dev 目錄下,有許多檔案,其中有兩個大類 字元裝置檔案和塊裝置檔案。字元設 備特殊檔案...