淺談Python的GIL機(jī)制

python多線程

實(shí)驗(yàn):

  • 開啟兩個(gè)線程
  • 一個(gè)線程sleep 4s 死循環(huán)打印
  • 另外一個(gè)線程sleep 1s 死循環(huán)打印

結(jié)果:會(huì)正常的交替運(yùn)行
結(jié)論:一個(gè)線程被阻塞的時(shí)候歧蕉,CPU會(huì)被釋放缎讼,然后另外一個(gè)線程被執(zhí)行。。

使用python為例子

參考資料:

[http://zhuoqiang.me/python-thread-gil-and-ctypes.html](http://zhuoqiang.me/python-thread-gil-and-ctypes.html)

所有Thread的PID都與主程序相同,而每個(gè)Process都有一個(gè)不同的PID要

單線程

使用如下的代碼:

#!coding=utf8
"""
使用多核
"""
import sys
sys.path.append('../../')

if __name__ == "__main__":
   print("start run here")
   while True:
       a = 4 / 34.0
   print('end run here')

開始運(yùn)行前


image.png

使用
python expmultiprocess.py

開始運(yùn)行后


image.png

可以看出,占滿一個(gè)核心的所有資源了。

主線程外再開啟一個(gè)線程


image.png

可以看出:

  1. 有兩個(gè)進(jìn)程號(hào)循头。PID是不一樣的。
  2. 所有的CPU并沒有占満

因?yàn)镚IL的原因:

  1. 單進(jìn)程單線程可以占用并占滿一個(gè)核心炎疆。
  2. 單進(jìn)程多線程可以占用多核心但無法占滿卡骂,只會(huì)分時(shí)復(fù)用。

GIL全局解釋器鎖

參考資料:http://zhuoqiang.me/python-thread-gil-and-ctypes.html

GIL 的全程為 Global Interpreter Lock 形入,意即全局解釋器鎖全跨。
在 Python 語言的主流實(shí)現(xiàn) CPython 中,GIL 是一個(gè)貨真價(jià)實(shí)的全局線程鎖亿遂,在解釋器解釋執(zhí)行任何 Python 代碼時(shí)浓若,都需要先獲得這把鎖才行,在遇到 I/O 操作時(shí)會(huì)釋放這把鎖蛇数。如果是純計(jì)算的程序挪钓,沒有 I/O 操作,解釋器會(huì)每隔 100 次操作就釋放這把鎖耳舅,讓別的線程有機(jī)會(huì)執(zhí)行碌上,這個(gè)次數(shù)可以通過sys.setcheckinterval。
所以雖然 CPython 的線程庫直接封裝操作系統(tǒng)的原生線程,但 CPython 進(jìn)程做為一個(gè)整體馏予,同一時(shí)間只會(huì)有一個(gè)獲得了 GIL 的線程在跑蔓纠,其它的線程都處于等待狀態(tài)等著 GIL 的釋放。這也就解釋了我們上面的實(shí)驗(yàn)結(jié)果:雖然有兩個(gè)死循環(huán)的線程吗蚌,而且有兩個(gè)物理 CPU 內(nèi)核,但因?yàn)?GIL 的限制纯出,兩個(gè)線程只是做著分時(shí)切換蚯妇,總的 CPU 占用率還略低于 50%。

以java為例子

Java的多線程是完全可以把多個(gè)核心跑滿的暂筝。

package com.data;

public class ThreadDemo extends Thread {

public ThreadDemo() {

}

public void run() {

while (true) {

continue;

}

}

public static void main(String[] args) {

try {

ThreadDemo h1 = new ThreadDemo();

h1.start();

ThreadDemo h2 = new ThreadDemo();

h2.start();

ThreadDemo h3 = new ThreadDemo();

h3.start();

h1.join();

h2.join();

h3.join();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

里面開啟了三個(gè)線程箩言,然后CPU三個(gè)核心都跑滿了。

image.png

使用pyspark運(yùn)行

Python可以通過一些專門的數(shù)據(jù)處理框架來實(shí)現(xiàn)高效利用CPU焕襟,直接所有的核心都利用起來了陨收。不用自己再去寫并行計(jì)算的內(nèi)容結(jié)構(gòu)了。

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鸵赖,一起剝皮案震驚了整個(gè)濱河市务漩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌它褪,老刑警劉巖饵骨,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異茫打,居然都是意外死亡居触,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門老赤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轮洋,“玉大人,你說我怎么就攤上這事抬旺”子瑁” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵嚷狞,是天一觀的道長块促。 經(jīng)常有香客問我,道長床未,這世上最難降的妖魔是什么竭翠? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮薇搁,結(jié)果婚禮上斋扰,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好传货,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布屎鳍。 她就那樣靜靜地躺著,像睡著了一般问裕。 火紅的嫁衣襯著肌膚如雪逮壁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天粮宛,我揣著相機(jī)與錄音窥淆,去河邊找鬼。 笑死巍杈,一個(gè)胖子當(dāng)著我的面吹牛忧饭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播筷畦,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼词裤,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了鳖宾?” 一聲冷哼從身側(cè)響起吼砂,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎攘滩,沒想到半個(gè)月后帅刊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡漂问,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年赖瞒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚤假。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡栏饮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出磷仰,到底是詐尸還是另有隱情袍嬉,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布灶平,位于F島的核電站伺通,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏逢享。R本人自食惡果不足惜罐监,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瞒爬。 院中可真熱鬧弓柱,春花似錦沟堡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至屁药,卻和暖如春粥血,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酿箭。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國打工立莉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人七问。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像茫舶,于是被迫代替她去往敵國和親械巡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一. 操作系統(tǒng)概念 操作系統(tǒng)位于底層硬件與應(yīng)用軟件之間的一層.工作方式: 向下管理硬件,向上提供接口.操作系統(tǒng)進(jìn)行...
    月亮是我踢彎得閱讀 5,971評(píng)論 3 28
  • 必備的理論基礎(chǔ) 1.操作系統(tǒng)作用: 隱藏丑陋復(fù)雜的硬件接口饶氏,提供良好的抽象接口讥耗。 管理調(diào)度進(jìn)程,并將多個(gè)進(jìn)程對(duì)硬件...
    drfung閱讀 3,541評(píng)論 0 5
  • 轉(zhuǎn)一篇關(guān)于Python GIL的文章疹启。歸納一下古程,CPU的大規(guī)模電路設(shè)計(jì)基本已經(jīng)到了物理意義的盡頭,所有廠商們都開始...
    SeanCheney閱讀 11,100評(píng)論 0 12
  • 前言:博主在剛接觸Python的時(shí)候時(shí)常聽到GIL這個(gè)詞,并且發(fā)現(xiàn)這個(gè)詞經(jīng)常和Python無法高效的實(shí)現(xiàn)多線程劃上...
    whypro閱讀 1,170評(píng)論 0 1
  • 早上醒來看看那初生的驕陽荤懂, 心靈被朝氣滋養(yǎng)茁裙。 忘卻了昨夜難眠的煩惱, 給自己打氣节仿, 今日是完美的一天晤锥! 我能行! ...
    醉夢(mèng)客閱讀 138評(píng)論 0 3