0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

GIL鎖是什么?為什么需要GIL鎖呢?

冬至子 ? 來源:BU科研通 ? 作者:BU科研通 ? 2023-09-20 15:44 ? 次閱讀

圖片

全局解釋器鎖或GIL是一個互斥鎖,它阻止多個本機線程同時執(zhí)行Python字節(jié)碼。這個鎖是必需的,主要是因為CPython的內(nèi)存管理不是線程安全的。(然而,由于GIL的存在,其他的特性已經(jīng)發(fā)展到依賴于它所執(zhí)行的保證。)

在CPython的環(huán)境下,即使在多核的情況下,同一個進程啟動多個線程,只能執(zhí)行一個線程。 無法利用多核的一個優(yōu)勢

GIL的優(yōu)點:

保證Cpython解釋器內(nèi)存管理的線程安全

GIL的缺點:

同一進程內(nèi)所有的線程同一時刻只能有一個執(zhí)行。
也就是說Cpython解釋器的多線程無法實現(xiàn)并行。

為什么需要GIL :

python中一切都是對象,Cpython中對象的回收,是通過對象的引用計數(shù)來判斷,當(dāng)對象的引用計數(shù)為0時,就會進行垃圾回收,自動釋放內(nèi)存。

但是如果多線程的情況,引用計數(shù)就變成了一個共享的變量 Cpython是當(dāng)下最流行的Python的解釋器,使用引用計數(shù)來管理內(nèi)存,在Python中,一切都是對象,引用計數(shù)就是指向?qū)ο蟮闹羔様?shù),當(dāng)這個數(shù)字變成0,則會進行垃圾回收,自動釋放內(nèi)存。但是問題是Cpython是線程不安全的。

考慮下如果有兩個線程A和B同時引用一個對象obj,這個時候obj的引用計數(shù)為2;A打算撤銷對obj的引用,完成第一步時引用計數(shù)減去1時,這時發(fā)生了線程切換,A掛起等待,還沒執(zhí)行銷毀對象操作。

B進入運行狀態(tài),這個時候B也對obj撤銷引用,并完成引用計數(shù)減1,銷毀對象,這個時候obj的引用數(shù)為0,釋放內(nèi)存。如果此時A重新喚醒,要繼續(xù)銷毀對象,可是這個時候已經(jīng)沒有對象了。所以為了保證不出現(xiàn)數(shù)據(jù)污染,才引入GIL。

CPU密集型:在高CPU利用率的代碼中,此時這種同一時刻只能有一個線程訪問CPU機制會響應(yīng)效率,如高計算類的代碼中。如真遇到這種情況,可以用多進程,不用多線程處理

IO密集型:處理文件、處理web請求、爬取網(wǎng)頁、設(shè)備文件、讀寫數(shù)據(jù)、send、recv,我們遇到的基本都是IO的,很少遇到計算類的東西

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 計數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2253

    瀏覽量

    94289
  • 多線程技術(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    12

    瀏覽量

    8543
  • python
    +關(guān)注

    關(guān)注

    55

    文章

    4768

    瀏覽量

    84378
收藏 人收藏

    評論

    相關(guān)推薦

    特高壓交流GIL輸電技術(shù)研究及應(yīng)用

    氣體絕緣輸電線路(gas-insulated transmission line,GIL)具有傳輸容量大、運行可靠性高、環(huán)境友好的特點,國內(nèi)外尚無特高壓GIL成熟產(chǎn)品和應(yīng)用案例,亟需開展其關(guān)鍵技術(shù)
    發(fā)表于 12-15 14:39 ?1次下載
    特高壓交流<b class='flag-5'>GIL</b>輸電技術(shù)研究及應(yīng)用

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

    GIL : Gas Insulated transmission Line 氣體絕緣輸電線路或 CGIT: Compressed Gas Insulated Transmission line
    發(fā)表于 09-10 08:00 ?44次下載
    什么是<b class='flag-5'>GIL</b>?GIS與<b class='flag-5'>GIL</b>的有什么區(qū)別?<b class='flag-5'>GIL</b>氣體絕緣輸電線路教程免費下載

    哪些因素影響智能價格?-坤坤智能

    哪些因素影響智能價格?-坤坤智能如今,市場上的智能價格從幾百到幾千的都有,為什么相差這么大?哪些因素影響智能價格
    發(fā)表于 11-21 10:04 ?447次閱讀

    為什么智能的價格比普通機械高?-諾托智能

    為什么智能的價格比普通機械高?-諾托智能如今,智能越來越普及化,很多家庭都選擇智能,但是,為什么智能
    發(fā)表于 12-03 11:44 ?382次閱讀

    關(guān)于智能需要了解什么?

    如今,智能已經(jīng)成為家居必備的產(chǎn)品,是智能家居必不可少的代表性產(chǎn)物。然而,在智能市場上不要單純地追趕智能門鎖潮流,而是細心了解、尋找真正適合自己的智能產(chǎn)品。那么,關(guān)于智能
    發(fā)表于 03-30 15:52 ?387次閱讀

    智能的電池怎么換_智能的市場前景

    智能區(qū)別于傳統(tǒng)的機械,傳統(tǒng)的機械門鎖是不需要電池進行驅(qū)動,可以永久使用,不用擔(dān)心電的問題,而智能門鎖因為是電子控制的,很多功能都需要電的支撐,所以
    發(fā)表于 04-07 14:30 ?9141次閱讀

    如何區(qū)分指紋門禁和指紋

    指紋門禁和指紋怎么區(qū)分?指紋門禁和指紋門鎖有何區(qū)別?在很多時候,普通消費者容易將指紋門禁和指紋門鎖的定義混淆,其實二者是有區(qū)別的,適用范圍和需求也不一樣,在選購產(chǎn)品時,
    發(fā)表于 06-11 14:43 ?4695次閱讀

    如何設(shè)置指紋

    隨著科技的發(fā)展,很多需要上鎖的東西都變成了使用指紋。指紋的好處在于它方便,而且不容易被打開。每個人的指紋都是獨一無二的,那么打開指紋的鑰匙也就是獨一無二的了?,F(xiàn)在很多人都會在手機
    發(fā)表于 06-15 17:35 ?5212次閱讀

    世界首條特高壓GIL工廠首次全面“體檢”,保障華東地區(qū)能源供應(yīng)

    7月29日,“萬里長江第一廊”——世界首條特高壓GIL管廊完成工程投運以來首次全面“體檢”,有力保障了今夏用電高峰期華東地區(qū)能源供應(yīng)安全,更好地促進長三角地區(qū)一體化發(fā)展。
    發(fā)表于 07-31 11:03 ?902次閱讀

    在全自動智能和半自動智能之間又該如何選擇

    就目前的智能產(chǎn)品選擇多樣,對一般家庭來說,在全自動智能和半自動智能之間又該如何選擇?其工作原理是什么?兩者之間又各有什么優(yōu)勢和區(qū)別
    的頭像 發(fā)表于 08-20 16:19 ?8811次閱讀

    GIL在CPython解釋器中的工作原理是什么?

    我是一個Python線程,我的工作就是解釋執(zhí)行程序員編寫的Python代碼。 之所以說是解釋執(zhí)行,是因為Python是高級語言,CPU那家伙不認識Python代碼,需要運行的時候動態(tài)翻譯成CPU指令
    的頭像 發(fā)表于 03-22 10:01 ?1330次閱讀
    <b class='flag-5'>GIL</b>在CPython解釋器中的工作原理是什么?

    為什么需要分布式 基于Zookeeper安全嗎

    這篇文章我想和你聊一聊,關(guān)于 Redis 分布式的「安全性」問題。 Redis 分布式的話題,很多文章已經(jīng)寫爛了,我為什么還要寫這篇文章? 因為我發(fā)現(xiàn)網(wǎng)上 99% 的文章,并沒有把這個問題真正
    的頭像 發(fā)表于 08-10 18:06 ?5567次閱讀

    Python新提案:使全局解釋器成為可選項

    如果該提案通過,意味著默認情況下 CPython 不會刪除或關(guān)閉 GIL,也不會讓用戶有選擇地啟用 / 刪除 GIL。因為--without-gil是一個編譯時標(biāo)志,可以在從源代碼構(gòu)建 Python
    的頭像 發(fā)表于 01-13 15:31 ?434次閱讀

    自旋和互斥的區(qū)別有哪些

    自旋 自旋與互斥很相似,在訪問共享資源之前對自旋進行上鎖,在訪問完成后釋放自旋(解鎖);事實上,從實現(xiàn)方式上來說,互斥
    的頭像 發(fā)表于 07-21 11:19 ?9336次閱讀

    互斥和自旋的實現(xiàn)原理

    保護共享資源不被多個線程同時訪問。它的實現(xiàn)原理主要包括以下幾個方面: 1. 的初始化 互斥鎖在創(chuàng)建時需要進行初始化,通常包括設(shè)置的狀態(tài)為“未鎖定”。在某些實現(xiàn)中,還需要初始化
    的頭像 發(fā)表于 07-10 10:07 ?388次閱讀