最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Python中的GIL(全局解釋器鎖)詳解及解決GIL的幾種方案

 更新時(shí)間:2021年01月29日 14:29:11   作者:托尼stark  
這篇文章主要介紹了詳解Python中的GIL(全局解釋器鎖)詳解及解決GIL的幾種方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

先看一道GIL面試題:

描述Python GIL的概念, 以及它對(duì)python多線程的影響?編寫一個(gè)多線程抓取網(wǎng)頁(yè)的程序,并闡明多線程抓取程序是否可比單線程性能有提升,并解釋原因。

GIL:又叫全局解釋器鎖,每個(gè)線程在執(zhí)行的過程中都需要先獲取GIL,保證同一時(shí)刻只有一個(gè)線程在運(yùn)行,目的是解決多線程同時(shí)競(jìng)爭(zhēng)程序中的全局變量而出現(xiàn)的線程安全問題。它并不是python語言的特性,僅僅是由于歷史的原因在CPython解釋器中難以移除,因?yàn)閜ython語言運(yùn)行環(huán)境大部分默認(rèn)在CPython解釋器中。

通過一個(gè)案例了解單線程和多線程的cpu占用率:

打開Ubuntu終端命令:輸入htop,回車,紅色箭頭指向的2代表此時(shí)我的虛擬機(jī)中CPU有兩個(gè)核心數(shù)

下面通過一個(gè)案例了解單線程死循環(huán)和多線程死循環(huán)的CPU占用率:

單線程死循環(huán).py: 

#coding=utf-8
while True:
  pass

運(yùn)行該程序,出現(xiàn)以下界面:

此時(shí)新開一個(gè)窗口,輸入htop,查看CPU占用率,其中一個(gè)CPU占用率幾乎為100%:

兩個(gè)線程死循環(huán).py

#coding=utf-8
import threading
 
#子線程死循環(huán)
def test():
  while True:
    pass
 
t1=threading.Thread(target=test)
t1.start()
 
#主線程死循環(huán),
while True:
  pass

此時(shí)新開一個(gè)終端,輸入htop查看CPU占用率,可以看到兩個(gè)CPU任何一個(gè)并沒有全部占滿,而是交替執(zhí)行的:

 這也就驗(yàn)證了多線程下每個(gè)線程在執(zhí)行的過程中都需要先獲取GIL,保證同一時(shí)刻只有一個(gè)線程在運(yùn)行。

由于GIL的存在,即使是多線程,事實(shí)上同一時(shí)刻只能保證一個(gè)線程在運(yùn)行,既然這樣多線程的運(yùn)行效率不就和單線程一樣了嗎,那為什么還要使用多線程呢?

由于以前的電腦基本都是單核CPU,多線程和單線程幾乎看不出差別,可是由于計(jì)算機(jī)的迅速發(fā)展,現(xiàn)在的電腦幾乎都是多核CPU了,最少也是兩個(gè)核心數(shù)的,這時(shí)差別就出來了:通過之前的案例我們已經(jīng)知道,即使在多核CPU中,多線程同一時(shí)刻也只有一個(gè)線程在運(yùn)行,這樣不僅不能利用多核CPU的優(yōu)勢(shì),反而由于每個(gè)線程在多個(gè)CPU上是交替執(zhí)行的,導(dǎo)致在不同CPU上切換時(shí)造成資源的浪費(fèi),反而會(huì)更慢。即原因是一個(gè)進(jìn)程只存在一把gil鎖,當(dāng)在執(zhí)行多個(gè)線程時(shí),內(nèi)部會(huì)爭(zhēng)搶gil鎖,這會(huì)造成當(dāng)某一個(gè)線程沒有搶到鎖的時(shí)候會(huì)讓cpu等待,進(jìn)而不能合理利用多核cpu資源。

例如在使用多線程抓取網(wǎng)頁(yè)內(nèi)容時(shí),遇到IO阻塞時(shí),正在執(zhí)行的線程會(huì)暫時(shí)釋放GIL鎖,這時(shí)其它線程會(huì)利用這個(gè)空隙時(shí)間,執(zhí)行自己的代碼,因此多線程抓取比單線程抓取性能要好。

說到在這里要先介紹兩個(gè)概念:計(jì)算密集型和IO密集型

計(jì)算密集型:要進(jìn)行大量的數(shù)值計(jì)算,例如進(jìn)行上億的數(shù)字計(jì)算、計(jì)算圓周率、對(duì)視頻進(jìn)行高清解碼等等。這種計(jì)算密集型任務(wù)雖然也可以用多任務(wù)完成,但是花費(fèi)的主要時(shí)間在任務(wù)切換的時(shí)間,此時(shí)CPU執(zhí)行任務(wù)的效率比較低。

IO密集型:涉及到網(wǎng)絡(luò)請(qǐng)求(time.sleep())、磁盤IO的任務(wù)都是IO密集型任務(wù),這類任務(wù)的特點(diǎn)是CPU消耗很少,任務(wù)的大部分時(shí)間都在等待IO操作完成(因?yàn)镮O的速度遠(yuǎn)遠(yuǎn)低于CPU和內(nèi)存的速度)。對(duì)于IO密集型任務(wù),任務(wù)越多,CPU效率越高,但也有一個(gè)限度。

解決GIL問題的方案:

1.使用其它語言,例如C,Java

2.使用其它解釋器,如java的解釋器jython

3.使用多進(jìn)程

線程釋放GIL鎖的情況:

1.在IO操作等可能會(huì)引起阻塞的system call之前,可以暫時(shí)釋放GIL,但在執(zhí)行完畢后,必須重新獲取GIL。

2.Python 3.x使用計(jì)時(shí)器(執(zhí)行時(shí)間達(dá)到閾值后,當(dāng)前線程釋放GIL)或Python 2.x,tickets計(jì)數(shù)達(dá)到100。

GIL面試題參考答案:

  • Python語言和GIL沒有什么關(guān)系。僅僅是由于歷史原因在Cpython虛擬機(jī)(解釋器),難以移除GIL。
  • GIL:全局解釋器鎖。每個(gè)線程在執(zhí)行的過程都需要先獲取GIL,保證同一時(shí)刻只有一個(gè)線程可以執(zhí)行代碼。
  • 線程釋放GIL鎖的情況: 在IO操作等可能會(huì)引起阻塞的system call之前,可以暫時(shí)釋放GIL,但在執(zhí)行完畢后,必須重新獲取GIL Python 3.x使用計(jì)時(shí)器(執(zhí)行時(shí)間達(dá)到閾值后,當(dāng)前線程釋放GIL)或Python 2.x,tickets計(jì)數(shù)達(dá)到100。
  • Python使用多進(jìn)程是可以利用多核的CPU資源的。
  • 多線程爬取比單線程性能有提升,因?yàn)橛龅絀O阻塞會(huì)自動(dòng)釋放GIL鎖。

到此這篇關(guān)于詳解Python中的GIL(全局解釋器鎖)詳解及解決GIL的幾種方案的文章就介紹到這了,更多相關(guān)Python GIL全局解釋器鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python肯德爾系數(shù)相關(guān)性數(shù)據(jù)分析示例

    python肯德爾系數(shù)相關(guān)性數(shù)據(jù)分析示例

    這篇文章主要為大家介紹了python肯德爾系數(shù)相關(guān)性數(shù)據(jù)分析示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Python入門教程之變量與數(shù)據(jù)類型

    Python入門教程之變量與數(shù)據(jù)類型

    這篇文章主要介紹了Python入門教程之變量與數(shù)據(jù)類型的相關(guān)知識(shí),文中給大家提到了變量的基本概念和數(shù)據(jù)類型的相關(guān)實(shí)例代碼,需要的朋友可以參考下
    2022-02-02
  • python遍歷 truple list dictionary的幾種方法總結(jié)

    python遍歷 truple list dictionary的幾種方法總結(jié)

    下面小編就為大家?guī)硪黄猵ython遍歷 truple list dictionary的幾種方法總結(jié)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-09-09
  • python讀取與寫入tif圖片的完整信息(過程詳解)

    python讀取與寫入tif圖片的完整信息(過程詳解)

    這篇文章主要介紹了python讀取與寫入tif圖片的完整信息,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • 解決Django響應(yīng)JsonResponse返回json格式數(shù)據(jù)報(bào)錯(cuò)問題

    解決Django響應(yīng)JsonResponse返回json格式數(shù)據(jù)報(bào)錯(cuò)問題

    這篇文章主要介紹了解決Django響應(yīng)JsonResponse返回json格式數(shù)據(jù)報(bào)錯(cuò)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • python3中http協(xié)議提供文件服務(wù)器功能詳解

    python3中http協(xié)議提供文件服務(wù)器功能詳解

    http協(xié)議是互聯(lián)網(wǎng)的通用基礎(chǔ)協(xié)議,也可以利用其來開發(fā)文件服務(wù)器,給客戶提供文件瀏覽,查看,下載,上傳等功能,這篇文章主要介紹了python3中http協(xié)議提供文件服務(wù)器功能,需要的朋友可以參考下
    2023-06-06
  • Python中文編碼那些事

    Python中文編碼那些事

    由于中文的特殊性,造成了在各大編程語言中都存在編碼轉(zhuǎn)換的問題,今天我們來探討下python中中文編碼如何處理呢
    2014-06-06
  • Postman安裝與使用詳細(xì)教程 附postman離線安裝包

    Postman安裝與使用詳細(xì)教程 附postman離線安裝包

    這篇文章主要介紹了Postman安裝與使用詳細(xì)教程 附postman離線安裝包,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Python使用分布式鎖的代碼演示示例

    Python使用分布式鎖的代碼演示示例

    這篇文章主要介紹了Python使用分布式鎖的代碼演示,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • python 一篇文章搞懂裝飾器所有用法(建議收藏)

    python 一篇文章搞懂裝飾器所有用法(建議收藏)

    這篇文章主要介紹了python 一篇文章搞懂裝飾器所有用法(建議收藏),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08

最新評(píng)論

广宗县| 宜宾县| 建昌县| 札达县| 成安县| 昆明市| 华安县| 玉树县| 潢川县| 邮箱| 潞西市| 桐梓县| 山东省| 磴口县| 平顶山市| 庆元县| 高陵县| 象山县| 贵南县| SHOW| 瑞金市| 荔浦县| 独山县| 清原| 浦东新区| 武冈市| 大新县| 都江堰市| 广南县| 丘北县| 曲靖市| 芦山县| 甘孜县| 会同县| 沅陵县| 永新县| 莱西市| 启东市| 闻喜县| 乌拉特前旗| 平顶山市|