python gil锁_python中的GIL锁
熟悉python的都知道,在C語(yǔ)言寫(xiě)的python解釋器中存在全局解釋器鎖,由于全局解釋器鎖的存在,在同一時(shí)間內(nèi),python解釋器只能運(yùn)行一個(gè)線程的代碼,這大大影響了python多線程的性能。而這個(gè)解釋器鎖由于歷史原因,現(xiàn)在幾乎無(wú)法消除。
python GIL 之所以會(huì)影響多線程等性能,是因?yàn)樵诙嗑€程的情況下,只有當(dāng)線程獲得了一個(gè)全局鎖的時(shí)候,那么該線程的代碼才能運(yùn)行,而全局鎖只有一個(gè),所以使用python多線程,在同一時(shí)刻也只有一個(gè)線程在運(yùn)行,因此在即使在多核的情況下也只能發(fā)揮出單核的性能。
既然python在同一時(shí)刻下只能運(yùn)行一個(gè)線程的代碼,那線程之間是如何調(diào)度的呢?
對(duì)于有io操作的線程,當(dāng)一個(gè)線程在做io操作的時(shí)候,因?yàn)閕o操作不需要cpu,所以,這個(gè)時(shí)候,python會(huì)釋放python全局鎖,這樣其他需要運(yùn)行的線程就會(huì)使用該鎖。
對(duì)于cpu密集型的線程,比如一個(gè)線程可能一直需要使用cpu做計(jì)算,那么python中會(huì)有一個(gè)執(zhí)行指令的計(jì)數(shù)器,當(dāng)一個(gè)線程執(zhí)行了一定數(shù)量的指令時(shí),該線程就會(huì)停止執(zhí)行并讓出當(dāng)前的鎖,這樣其他的線程就可以執(zhí)行代碼了。
由上面可知,至少有兩種情況python會(huì)做線程切換,一是一但有IO操作時(shí),會(huì)有線程切換,二是當(dāng)一個(gè)線程連續(xù)執(zhí)行了一定數(shù)量的指令時(shí),會(huì)出現(xiàn)線程切換。當(dāng)然此處的線程切換不一定就一定會(huì)切換到其他線程執(zhí)行,因?yàn)槿绻?dāng)前線程 優(yōu)先級(jí)比較高的話(huà),可能在讓出鎖以后,又繼續(xù)獲得鎖,并優(yōu)先執(zhí)行。
在做科學(xué)計(jì)算的時(shí)候是用的單線程,因?yàn)檫@種計(jì)算是需要CPU一直做計(jì)算的,如果用多線程反而會(huì)降低計(jì)算速度。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的python gil锁_python中的GIL锁的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python if main_pytho
- 下一篇: python循环输入字典_python