Python GIL 機制

Python GIL(Global Interpreter Lock) 解釋器鎖

GIL本質就是一把互斥鎖溺欧,將并發(fā)變成串行官还,以此來控制同一時間共享數(shù)據(jù)只能被一個任務所修改,進而保證數(shù)據(jù)的安全性。在Cpython解釋器中剥槐,同一個進程下開啟多線程慨灭,同一時刻只能有一個線程執(zhí)行朦乏,無法利用多核優(yōu)勢。GIL并不是Python的特性氧骤,Python完全可以不依賴于GIL呻疹。

線程互斥鎖的示例:

from threading import Thread, Lock
import time

n = 100


def task():
    global n
    with mutex:  # 獲取鎖 相當于 mutex.acquire() 和 mutex.release()
        temp = n
        time.sleep(0.1)
        n = temp - 1


if __name__ == '__main__':
    starttime = time.time()
    mutex = Lock()  # 生成一個鎖對象
    t_l = []
    for i in range(100):
        t = Thread(target=task)
        t_l.append(t)
        t.start()

    for t in t_l:
        t.join()
    stoptime = time.time()

    print('主線程 %s ' % n)
    print('run time is %s' % (stoptime - starttime))

輸出結果:

主線程 0 
run time is 10.062247514724731

如果不加鎖,則出現(xiàn)如下結果:

主線程 99 
run time is 0.11712527275085449
  • CPU是用來做計算的筹陵,在I/O密集性的任務下刽锤,并不能發(fā)揮CPU的多核優(yōu)勢镊尺,反而使用線程開銷更小,任務處理更快并思。
  • 在計算型任務中庐氮,使用多進程可以利用計算機的多核優(yōu)勢,能并行執(zhí)行任務宋彼,速度更快弄砍。

計算密集型任務,多進程和和線程的效率比較

from multiprocessing import Process
from threading import Thread
import os,time
def work():
    res=0
    for i in range(100000000):
        res*=i


if __name__ == '__main__':
    l=[]
    print(os.cpu_count()) #本機為12核
    start=time.time()
    for i in range(12):
        p=Process(target=work) #  使用多進程時間為 9.17792010307312
        p=Thread(target=work) # 使用多線程時間為 43.76649355888367
        l.append(p)
        p.start()
    for p in l:
        p.join()
    stop=time.time()
    print('run time is %s' %(stop-start))

# 計算密集型:多進程效率更高

I/O密集型任務输涕,多進程和多線程的效率比較

from multiprocessing import Process
from threading import Thread
import threading
import os,time
def work():
    time.sleep(2)
    print('===>')

if __name__ == '__main__':
    l=[]
    print(os.cpu_count()) #本機為4核
    start=time.time()
    for i in range(400):
        p=Process(target=work) # 使用多進程音婶,耗時 6.676343202590942
        p=Thread(target=work)    # 使用多線程,耗時 2.049600124359131
        l.append(p)
        p.start()
    for p in l:
        p.join()
    stop=time.time()
    print('run time is %s' %(stop-start))

# I/O密集型:多線程效率高

現(xiàn)在計算機基本上都是多核莱坎,python對于計算密集型的任務開多個線程的效率并不能帶來多大的提升衣式,甚至如串行(沒有大量的切換),但是檐什,對于I/O密集型的任務效率還是有顯著提升的碴卧。

  • 多線程用于IO密集型,如Socket, 爬蟲厢汹,web
  • 多進程用于計算密集型螟深,如金融分析

GIL和python應用程序鎖的關系

GIL鎖并不會保護python程序中的數(shù)據(jù),只在解釋器級別實現(xiàn)鎖的機制烫葬,在python應用中界弧,如果遇到IO操作,已經獲得鎖的線程或者進程或保留鎖的狀態(tài)搭综,其他線程在這種狀態(tài)下獲取鎖進行問的操作垢箕。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市兑巾,隨后出現(xiàn)的幾起案子条获,更是在濱河造成了極大的恐慌,老刑警劉巖蒋歌,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帅掘,死亡現(xiàn)場離奇詭異,居然都是意外死亡堂油,警方通過查閱死者的電腦和手機修档,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來府框,“玉大人吱窝,你說我怎么就攤上這事。” “怎么了院峡?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵兴使,是天一觀的道長。 經常有香客問我照激,道長发魄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任俩垃,我火速辦了婚禮欠母,結果婚禮上,老公的妹妹穿的比我還像新娘吆寨。我一直安慰自己,他們只是感情好踩寇,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布啄清。 她就那樣靜靜地躺著,像睡著了一般俺孙。 火紅的嫁衣襯著肌膚如雪辣卒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天睛榄,我揣著相機與錄音荣茫,去河邊找鬼。 笑死场靴,一個胖子當著我的面吹牛啡莉,可吹牛的內容都是我干的。 我是一名探鬼主播旨剥,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼咧欣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了轨帜?” 一聲冷哼從身側響起魄咕,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蚌父,沒想到半個月后哮兰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡苟弛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年喝滞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗡午。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡囤躁,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情狸演,我是刑警寧澤言蛇,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站宵距,受9級特大地震影響腊尚,放射性物質發(fā)生泄漏。R本人自食惡果不足惜满哪,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一婿斥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哨鸭,春花似錦民宿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至只估,卻和暖如春志群,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛔钙。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工锌云, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吁脱。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓桑涎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親豫喧。 傳聞我的和親對象是個殘疾皇子石洗,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內容

  • 一. 操作系統(tǒng)概念 操作系統(tǒng)位于底層硬件與應用軟件之間的一層.工作方式: 向下管理硬件,向上提供接口.操作系統(tǒng)進行...
    月亮是我踢彎得閱讀 5,967評論 3 28
  • 必備的理論基礎 1.操作系統(tǒng)作用: 隱藏丑陋復雜的硬件接口,提供良好的抽象接口紧显。 管理調度進程讲衫,并將多個進程對硬件...
    drfung閱讀 3,541評論 0 5
  • 轉一篇關于Python GIL的文章。歸納一下孵班,CPU的大規(guī)模電路設計基本已經到了物理意義的盡頭涉兽,所有廠商們都開始...
    SeanCheney閱讀 11,098評論 0 12
  • 是夜,風中搖曳的樹葉篙程,呼哧呼哧的枷畏,像是隨時要斷氣似的。周圍無比安靜的感覺真是讓人討厭虱饿,好像自己被這么世界拋棄了一樣...
    藍夜蝸牛閱讀 176評論 0 0
  • 在成都發(fā)展如果想鏈接更多愛智求真的小伙伴有兩個平臺絕逼需要關注一個是啡信 一個是樹舍 啡信是第三方社群服務平臺為社...
    承謙閱讀 583評論 0 0