全局解釋器鎖或GIL是一個(gè)互斥鎖,它阻止多個(gè)本機(jī)線程同時(shí)執(zhí)行Python字節(jié)碼。這個(gè)鎖是必需的,主要是因?yàn)镃Python的內(nèi)存管理不是線程安全的。(然而,由于GIL的存在,其他的特性已經(jīng)發(fā)展到依賴于它所執(zhí)行的保證。)
在CPython的環(huán)境下,即使在多核的情況下,同一個(gè)進(jìn)程啟動(dòng)多個(gè)線程,只能執(zhí)行一個(gè)線程。 無(wú)法利用多核的一個(gè)優(yōu)勢(shì) 。
GIL的優(yōu)點(diǎn):
保證Cpython解釋器內(nèi)存管理的線程安全
GIL的缺點(diǎn):
同一進(jìn)程內(nèi)所有的線程同一時(shí)刻只能有一個(gè)執(zhí)行。
也就是說(shuō)Cpython解釋器的多線程無(wú)法實(shí)現(xiàn)并行。
為什么需要GIL :
python中一切都是對(duì)象,Cpython中對(duì)象的回收,是通過(guò)對(duì)象的引用計(jì)數(shù)來(lái)判斷,當(dāng)對(duì)象的引用計(jì)數(shù)為0時(shí),就會(huì)進(jìn)行垃圾回收,自動(dòng)釋放內(nèi)存。
但是如果多線程的情況,引用計(jì)數(shù)就變成了一個(gè)共享的變量 Cpython是當(dāng)下最流行的Python的解釋器,使用引用計(jì)數(shù)來(lái)管理內(nèi)存,在Python中,一切都是對(duì)象,引用計(jì)數(shù)就是指向?qū)ο蟮闹羔様?shù),當(dāng)這個(gè)數(shù)字變成0,則會(huì)進(jìn)行垃圾回收,自動(dòng)釋放內(nèi)存。但是問(wèn)題是Cpython是線程不安全的。
考慮下如果有兩個(gè)線程A和B同時(shí)引用一個(gè)對(duì)象obj,這個(gè)時(shí)候obj的引用計(jì)數(shù)為2;A打算撤銷對(duì)obj的引用,完成第一步時(shí)引用計(jì)數(shù)減去1時(shí),這時(shí)發(fā)生了線程切換,A掛起等待,還沒(méi)執(zhí)行銷毀對(duì)象操作。
B進(jìn)入運(yùn)行狀態(tài),這個(gè)時(shí)候B也對(duì)obj撤銷引用,并完成引用計(jì)數(shù)減1,銷毀對(duì)象,這個(gè)時(shí)候obj的引用數(shù)為0,釋放內(nèi)存。如果此時(shí)A重新喚醒,要繼續(xù)銷毀對(duì)象,可是這個(gè)時(shí)候已經(jīng)沒(méi)有對(duì)象了。所以為了保證不出現(xiàn)數(shù)據(jù)污染,才引入GIL。
CPU密集型:在高CPU利用率的代碼中,此時(shí)這種同一時(shí)刻只能有一個(gè)線程訪問(wèn)CPU機(jī)制會(huì)響應(yīng)效率,如高計(jì)算類的代碼中。如真遇到這種情況,可以用多進(jìn)程,不用多線程處理
IO密集型:處理文件、處理web請(qǐng)求、爬取網(wǎng)頁(yè)、設(shè)備文件、讀寫(xiě)數(shù)據(jù)、send、recv,我們遇到的基本都是IO的,很少遇到計(jì)算類的東西
-
計(jì)數(shù)器
+關(guān)注
關(guān)注
32文章
2284瀏覽量
96021 -
多線程技術(shù)
+關(guān)注
關(guān)注
0文章
12瀏覽量
8636 -
python
+關(guān)注
關(guān)注
56文章
4823瀏覽量
86153
發(fā)布評(píng)論請(qǐng)先 登錄
特高壓交流GIL輸電技術(shù)研究及應(yīng)用

什么是GIL?GIS與GIL的有什么區(qū)別?GIL氣體絕緣輸電線路教程免費(fèi)下載

哪些因素影響智能鎖價(jià)格?-坤坤智能鎖
為什么智能鎖的價(jià)格比普通機(jī)械鎖高?-諾托智能鎖
關(guān)于智能鎖需要了解什么呢?
智能鎖的電池怎么換_智能鎖的市場(chǎng)前景
如何區(qū)分指紋門(mén)禁鎖和指紋鎖
如何設(shè)置指紋鎖
世界首條特高壓GIL工廠首次全面“體檢”,保障華東地區(qū)能源供應(yīng)
在全自動(dòng)智能鎖和半自動(dòng)智能鎖之間又該如何選擇呢?
GIL在CPython解釋器中的工作原理是什么?

評(píng)論