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資源 互斥鎖的使用前提 多條執行緒搶奪同一塊資源 執行緒同步的意思是 多條執行緒按順序地執行任務...