熟悉python的都知道,在C語言寫的python解釋器中存在全局解釋器鎖,由于全局解釋器鎖的存在微猖,在同一時間內(nèi),python解釋器只能運(yùn)行一個線程的代碼缘屹,這大大影響了python多線程的性能凛剥。而這個解釋器鎖由于歷史原因,現(xiàn)在幾乎無法消除轻姿。
python GIL 之所以會影響多線程等性能犁珠,是因?yàn)樵诙嗑€程的情況下,只有當(dāng)線程獲得了一個全局鎖的時候互亮,那么該線程的代碼才能運(yùn)行犁享,而全局鎖只有一個,所以使用python多線程豹休,在同一時刻也只有一個線程在運(yùn)行饼疙,因此在即使在多核的情況下也只能發(fā)揮出單核的性能。
既然python在同一時刻下只能運(yùn)行一個線程的代碼慕爬,那線程之間是如何調(diào)度的呢窑眯??
對于有io操作的線程,當(dāng)一個線程在做io操作的時候医窿,因?yàn)閕o操作不需要cpu磅甩,所以,這個時候姥卢,python會釋放python全局鎖卷要,這樣其他需要運(yùn)行的線程就會使用該鎖。?
對于cpu密集型的線程独榴,比如一個線程可能一直需要使用cpu做計算僧叉,那么python中會有一個執(zhí)行指令的計數(shù)器,當(dāng)一個線程執(zhí)行了一定數(shù)量的指令時棺榔,該線程就會停止執(zhí)行并讓出當(dāng)前的鎖瓶堕,這樣其他的線程就可以執(zhí)行代碼了。?
由上面可知症歇,至少有兩種情況python會做線程切換郎笆,一是一但有IO操作時,會有線程切換忘晤,二是當(dāng)一個線程連續(xù)執(zhí)行了一定數(shù)量的指令時宛蚓,會出現(xiàn)線程切換。當(dāng)然此處的線程切換不一定就一定會切換到其他線程執(zhí)行设塔,因?yàn)槿绻?dāng)前線程 優(yōu)先級比較高的話凄吏,可能在讓出鎖以后,又繼續(xù)獲得鎖,并優(yōu)先執(zhí)行痕钢。
在做科學(xué)計算的時候是用的單線程表谊,因?yàn)檫@種計算是需要CPU一直做計算的,如果用多線程反而會降低計算速度盖喷。