面試經(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模塊也是可以的。