一句話講清楚GIL鎖

2021-10-02 22:45:26 字數 1546 閱讀 9879

什麼是"全域性gil鎖"

全域性指的是所有cpu,

鎖指的每次是只有乙個cpu的執行緒可以執行io任務

銀行四個視窗(程序),四個隊伍的客戶在排隊辦理業務,

python中的"全域性gil鎖"的意思是:

一旦有乙個視窗在辦理客戶的業務,其他三個視窗必須停止辦理,直到這個視窗辦理完業務,其他視窗才有機會給客戶辦理業務.

boke多個視窗有客戶在排隊,但是所有視窗後面共享乙個客服,客服只能輪流辦理業務.

也就是說,python的多執行緒機制,無論你的計算機是多少核,在python的多執行緒眼裡都是單核cpu

也就是說對於io密集任務,不存在"跨核的多執行緒"並行一起處理業務的可能行.

所以我們說,python最佳方式是:

多程序+協程的方式

而不是

多程序+執行緒的方式

python不存在並行io,只有單核併發io

-----------------------------------------

多程序和多協程提公升效能的角度是不一樣的.

多程序走多核,響應效能的提公升在於:各個core各幹各的.

多協程走的是單core(非py語言則也是多core,受限制於各個程序),響應效能的提公升在於及時交出"等待權"第三方api(例如網頁等)

-----------------------------------------

[1]中也提到:

由於 gil 的存在,大多數情況下 python 多執行緒無法利用多核優勢。

但是我們部署的時候還是會使用多程序+多攜程的方式,這是為什麼呢?

因為cpu密集使用多程序依然是有效的.

根據[2]

乙個執行緒有兩種情況下會釋放全域性直譯器鎖,一種情況是在該執行緒進入io操作之前,會主動釋放gil,另一種情況是直譯器不間斷執行了1000位元組碼(py2)或執行15毫秒(py3)後,該執行緒也會放棄gil。

根據[3]

gil是全域性排它鎖,

如果多執行緒任務是io密集型,就會直接釋放gil,解除阻塞,提高了效能,

如果多執行緒任務是cpu密集型,因為乙個程序只有乙個gil,多個執行緒共享這乙個gil,所以乙個執行緒釋放了gil,另乙個就會喚醒,而釋放gil的執行緒就會等待下一次被喚醒,導致效率不會提高,不過可以使用多程序解決。

reference:

[1]從偽並行的 python 多執行緒說起

[2]深入理解python中的gil(全域性直譯器鎖)。

[3]高併發(一)通俗易懂解釋io,cpu密集任務及gil

一句話講清楚關於精確度和召回率的區別

看過許多ai書籍,關於混淆矩陣裡的精確度precision 和 召回率recall 這2個概念,看懂了但是總是容易混在一起,很很影響使用。死記硬背公式,用處不大。後來認真研究發現,原來他們2者的主要差異就在於 測試的物件是單個類別還是多個類別。如果是多個類別的準確度測試就是精確度,如果對單乙個類別的...

mysql 匯出一句話 MySQL 匯出一句話

drop table if exists temp 如果存在temp就刪掉 create table temp cmd text not null 建立temp表,裡面就乙個cmd欄位 insert into temp cmd values php eval post cmd 把一句話木馬插入到te...

一句話提醒

1 在c 中,父窗體要訪問子窗體變數,需將子窗體變數設為public才能訪問。2 每 5 秒重新整理頁面 5 秒後重定向頁面 3 block 此元素將顯示為塊級元素,此元素前後會帶有換行符。inline 預設。此元素會被顯示為內聯元素,元素前後沒有換行符。4 document.getelementb...