GIL鎖,執行緒池,同步非同步

2022-09-20 02:51:15 字數 1689 閱讀 4643

1.gil

是乙個全域性直譯器鎖 ,是一種互斥鎖

為什麼需要gil:因為乙個python.exe程序中只有一分直譯器,如果這個程序開啟了多個執行緒都要執行**

多執行緒之間要競爭直譯器,一旦競爭就有可能出現問題

帶來的問題:同一時間只有乙個執行緒可以訪問直譯器

好處:保證了多執行緒的資料完全

thread-safe 執行緒安全的 多個執行緒同時訪問也不會出問題

not thread-safe 非執行緒安全的 多個執行緒同時訪問可能會出問題 (加鎖)

預設情況下乙個程序只有乙個執行緒 是不會出現問題的 ,但是不要忘記還有gc執行緒

一旦出現多個執行緒就可能出問題 ,所以當初就簡單粗暴的加上了gil鎖

那麼多執行緒是不是完全沒有意義?

由於有gil的存在 即使有多個cpu 也不能真正的並行

有三個任務 三個任務要併發執行 使效率最高

1.多程序

2.同乙個程序下多執行緒

只有乙個cpu

如果3個任務都要等待io

如果是採用方案1: 由於io的時間較長 不僅不能提高效率 反而無謂的增加了系統開銷

方案2 更好

有三個cpu

如果是採用方案1 並且三個任務都沒有io操作: 開啟三個程序 並行的來執行 效率更高

如果是採用方案2 並且三個任務都沒有io操作: 開三個執行緒 必須序列執行 所以效率比程序更低

應用程式分為兩種

1.io密集型 io操作較多 純計算較少 採用多執行緒

2.計算密集型 計算操作較多 io較少 採用多程序

應用場景:

tcp程式 應該採用多執行緒

純計算 例如人臉識別 語音識別等 採取多程序

gil是什麼 為什麼出現 如何解決其帶來的效率問題

既然已經有鎖了 還需要自己加鎖嗎?

什麼情況需要自己加鎖 當多個執行緒需要共享乙個不屬於直譯器的資源時 必須要自己加

不用加鎖的例子: 多個執行緒要併發修改某乙個變數資料

2.執行緒池 程序池

池就是容器

伺服器不可能無線的開執行緒 ,所以需要對執行緒數量加以控制,執行緒池就是幫我們封裝了執行緒數量的控制 以及 執行緒的建立 銷毀 任務的分配

使用方法一樣的

特點:執行緒池 在建立時不會立即開啟執行緒

等到提交任務時 如果沒有空閒執行緒 並且已存在的執行緒數量 小於最大值 開個新的

執行緒開啟以後就不會在關閉了 直到程序全部結束為止

3.同步 非同步 阻塞 非阻塞

阻塞: 程式執行過程中遇到io操作 無法繼續

非阻塞: 程式正在執行中,並且沒有遇到io操作,即時遇到io也不會阻塞,cpu不會切走

指的是程式的執行的狀態

指的是發起任務的方式

同步:在發起任務後必須在原地等待 任務執行完畢 才能繼續往下執行

非同步:在發起任務後立即繼續往下執行,不需要等待任務的執行結果

結果上哪去獲取

shutdown(wait=true) 這個方法能夠知道池裡面的執行緒是否全部完成

在判斷執行緒都完成之後就輸出結果:

池有乙個乙個方法result 可以輸出所有結果

非同步效率高於同步

發起非同步任務的方式 就是執行緒和程序

同步和阻塞 是完全不同的:

阻塞一定是cpu已經切走了

同步雖然也會卡住 但是cpu沒切走 還在你的程序中

GIL直譯器鎖,執行緒補充

gil是乙個互斥鎖 存在於cpython 保證資料的安全 以犧牲效率換區資料的安全性 阻止同乙個程序內多個執行緒同時執行 不能並行但是能夠實現併發 併發 發起來像是同時進行的 gil全域性直譯器存在的原因是cpython直譯器的記憶體管理不是執行緒安全的 同乙個程序下多個執行緒不能實現並行但能實現併...

多執行緒執行原理分析 GiL鎖 執行緒互斥鎖

首先丟擲問題 1.gil鎖和執行緒互斥鎖在整個程式中有何屌用?鎖的是什麼?2.多執行緒究竟是如果競爭offer?作業系統 直譯器 執行多執行緒的流程?直接貼圖 個人理解 參考繪製,如有問題,請指正 解釋 t1 1.執行緒1和執行緒2分別讀取共享資料池變數a的指標 2.t1競爭到gil鎖,cpytho...

64 互斥鎖 執行緒通訊 執行緒同步

1 互斥鎖 互斥鎖使用格式 synchronized 鎖物件 注意 鎖定1份 只用1把鎖,用多把鎖是無效的 互斥鎖的優缺點 優點 能有效防止因多執行緒搶奪資源造成的資料安全問題 缺點 需要消耗大量的cpu資源 互斥鎖的使用前提 多條執行緒搶奪同一塊資源 執行緒同步的意思是 多條執行緒按順序地執行任務...