GIL全局解釋鎖

面試經(jīng)常遇到的。

GIL不是Python特性

GIL是Python解釋器(Cpython)時(shí)引入的概念,在JPython、PyPy中沒(méi)有GIL。GIL并不是Python的語(yǔ)言缺陷。

GIL定義

GIL,the Global Interpreter Lock,直譯為“全局解釋鎖”

GIL存在原因

CPython在執(zhí)行多線(xiàn)程的時(shí)候并不是線(xiàn)程安全的,所以為了程序的穩(wěn)定性,加一把全局解釋鎖,能夠確保任何時(shí)候都只有一個(gè)Python線(xiàn)程執(zhí)行。

GIL的弊端

  • GIL對(duì)計(jì)算密集型的程序會(huì)產(chǎn)生影響。因?yàn)橛?jì)算密集型的程序,需要占用系統(tǒng)資源。GIL的存在,相當(dāng)于始終在進(jìn)行單線(xiàn)程運(yùn)算,這樣自然就慢了。

  • IO密集型影響不大的原因在于,IO,input/output,這兩個(gè)詞就表明程序的瓶頸在于輸入所耗費(fèi)的時(shí)間,線(xiàn)程大部分時(shí)間在等待,所以它們是多個(gè)一起等(多線(xiàn)程)還是單個(gè)等(單線(xiàn)程)無(wú)所謂的。

    這就好比,你在公交站等公交時(shí),你們排隊(duì)等公交(單線(xiàn)程)還是沿著馬路一字排開(kāi)等(多線(xiàn)程)是無(wú)所謂的。公交車(chē)(即input,即輸入的資源)沒(méi)來(lái),哪種方式都是瞎折騰。

解決方案

multiprocessing

multiprocessing是一個(gè)多進(jìn)程模塊,開(kāi)多個(gè)進(jìn)程,每個(gè)進(jìn)程都帶一個(gè)GIL,就相當(dāng)于多線(xiàn)程來(lái)用了。

multiprocessing的弊端

多線(xiàn)程與多進(jìn)程一個(gè)不同點(diǎn)在于:

  • 多線(xiàn)程是共享內(nèi)存的,即這些線(xiàn)程共用一個(gè)內(nèi)存地址。好處在于便于線(xiàn)程間數(shù)據(jù)通信和數(shù)據(jù)同步。
  • 多進(jìn)程,各個(gè)進(jìn)程地址之間是獨(dú)立的內(nèi)存地址。這樣不存內(nèi)存地址之間通信就麻煩了。
    綜上所述,如果是IO密集型且對(duì)數(shù)據(jù)通信有需求,使用python 的threading模塊也是可以的。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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