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

python全局解釋器GIL鎖機制詳解

 更新時間:2022年12月19日 13:59:04   作者:敲代碼敲到頭發(fā)茂密  
我們要知道一點GIL并不是Python的特性,它是Python解釋器Cpython引入的一個概念,下面這篇文章主要給大家介紹了關于python全局解釋器GIL鎖機制的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下

一、GIL全局解釋器鎖

1、GIL鎖不是python的特點。而是cpython的特點。

2、在cpython解釋器中,GIL是一把互斥鎖,用來保證進程中同一個時刻只有一個線程在執(zhí)行。

3、在沒有GIL鎖的情況下,有可能多線程在執(zhí)行一個代碼的同時,垃圾回收機制對所執(zhí)行代碼的變量直接進行回收,其他的線程再使用該變量時會導致運行錯誤。

二、為什么會有GIL鎖?

python使用引用計數為主,標記清楚和隔代回收為輔來進行內存管理。所有python腳本中創(chuàng)建的對象,都會配備一個引用計數,來記錄有多少個指針來指向它。當對象的引用技術為0時,會自動釋放其所占用的內存。

假設有2個python線程同時引用一個數據(a=100,引用計數為1),

2個線程都會去操作該數據,由于多線程對同一個資源的競爭,實際上引用計數為3,

但是由于沒有GIL鎖,導致引用計數只增加1(引用計數為2)

這造成的后果是,當第1個線程結束時,會把引用計數減少為1;當第2個線程結束時,會把引用計數減少為0;

當下一個線程再次視圖訪問這個數據時,就無法找到有效的內存了**

三、多線程無法利用多核優(yōu)勢?

由于GIL鎖的存在,即使是多個線程處理任務,但是最終只有一個線程在工作,那么是不是多線程真的一點用處都沒有了呢?

對于需要執(zhí)行的任務來說,分為兩種:計算密集型、IO 密集型

假如一個計算密集型的任務需要10s的執(zhí)行時間,總共有4個這樣的任務

在 4核及以上的情況下:
多進程:需要開啟 4 個進程,但是 4 個 CPU 并行,最終只需要消耗 10s 多一點的時間。
多線程:只需要開1 個進程,這個進程開啟 4 個線程,開啟線程所消耗的資源很少,但是由于最終執(zhí)行是只有一個 CPU 可以工作,所以最終消耗 40s 多的時間。

假如是多個 IO密集型 的任務

CPU 大多數時間是處于閑置狀態(tài),頻繁的切換

多進程:進程進行切換需要消耗大量資源
多線程:線程進行切換并不需要消耗大量資源

計算密集型和IO密集型

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

IO密集型:涉及到網絡請求(time.sleep())、磁盤IO的任務都是IO密集型任務,這類任務的特點是CPU消耗很少,任務的大部分時間都在等待IO操作完成(因為IO的速度遠遠低于CPU和內存的速度)。對于IO密集型任務,任務越多,CPU效率越高,但也有一個限度。

計算密集型——采用多進程

執(zhí)行時間為: 4.062887668609619

from multiprocessing import Process
import time

def func1():
    sum=0
    for i in range(100000000):
        sum+=1
    print(sum)

if __name__ == '__main__':

    now=time.time()
    l=[]
    for i in range(10):
        p=Process(target=func1)
        p.start()
        l.append(p)
    for p in l:
        p.join()
    end=time.time()
    print('執(zhí)行時間為:',end-now)

計算密集型——采用多線程

執(zhí)行時間為: 27.6159188747406

from threading import Thread
import time

def func1():
    sum=0
    for i in range(100000000):
        sum+=1
    print(sum)

if __name__ == '__main__':

    now=time.time()
    l=[]
    for i in range(10):
        p=Thread(target=func1)
        p.start()
        l.append(p)
    for p in l:
        p.join()
    end=time.time()
    print('執(zhí)行時間為:',end-now)

IO密集型——采用多進程

執(zhí)行時間為: 5.388434886932373

from multiprocessing import Process
import time

def func1():
    time.sleep(2)

if __name__ == '__main__':

    now=time.time()
    l=[]
    for i in range(100):
        p=Process(target=func1)
        p.start()
        l.append(p)
    for p in l:
        p.join()
    end=time.time()
    print('執(zhí)行時間為:',end-now)

IO密集型——采用多線程

執(zhí)行時間為: 2.0174973011016846

from threading import Thread
import time

def func1():
    time.sleep(2)

if __name__ == '__main__':

    now=time.time()
    l=[]
    for i in range(100):
        p=Thread(target=func1)
        p.start()
        l.append(p)
    for p in l:
        p.join()
    end=time.time()
    print('執(zhí)行時間為:',end-now)

四、總結

對于IO密集型應用,即便有GIL存在,由于IO操作會導致GIL釋放,其他線程能夠獲得執(zhí)行權限。由于多線程的通訊成本低于多進程,因此偏向使用多線程。

對于計算密集型應用,由于CPU一直處于被占用狀態(tài),GIL鎖直到規(guī)定時間才會釋放,然后才會切換狀態(tài),導致多線程處于絕對的劣勢,此時可以采用多進程+協程。

到此這篇關于python全局解釋器GIL鎖機制的文章就介紹到這了,更多相關python GIL鎖詳解內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python中不同數據對象的空值校驗的方法小結

    Python中不同數據對象的空值校驗的方法小結

    Python中有多種數據對象,每種都有其特定的空值表示方法和校驗方式,本文將深入探討這些空值校驗的方法,有需要的小伙伴可以參考一下
    2024-04-04
  • 利用Python實現Shp格式向GeoJSON的轉換方法

    利用Python實現Shp格式向GeoJSON的轉換方法

    JSON(JavaScript Object Nonation)是利用鍵值對+嵌套來表示數據的一種格式,以其輕量、易解析的優(yōu)點,這篇文章主要介紹了利用Python實現Shp格式向GeoJSON的轉換,需要的朋友可以參考下
    2019-07-07
  • python的help函數如何使用

    python的help函數如何使用

    在本篇文章里小編給大家整理的是關于python的help函數的相關用法和知識點總結,需要的朋友們可以學習下。
    2020-06-06
  • Python+matplotlib實現折線圖的美化

    Python+matplotlib實現折線圖的美化

    這篇文章主要和大家分享一個非常有趣的Python教程—如何美化一個?matplotlib折線圖。文中的示例代碼講解詳細,感興趣的可以了解一下
    2022-05-05
  • pygame用blit()實現動畫效果的示例代碼

    pygame用blit()實現動畫效果的示例代碼

    這篇文章主要介紹了pygame用blit()實現動畫效果的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • Python flask框架實現查詢數據庫并顯示數據

    Python flask框架實現查詢數據庫并顯示數據

    這篇文章主要介紹了Python flask框架實現查詢數據庫并顯示數據,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • 利用Python編寫一個藏頭詩在線生成器

    利用Python編寫一個藏頭詩在線生成器

    這篇文章主要介紹了如何利用Python編寫一個藏頭詩在線生成器,文中的示例代碼講解詳細,感興趣的同學可以跟隨小編一起動手嘗試一下
    2022-04-04
  • Python如何操作office實現自動化及win32com.client的運用

    Python如何操作office實現自動化及win32com.client的運用

    這篇文章主要介紹了Python如何操作office實現自動化及win32com.client的運用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • python數組排序方法之sort、sorted和argsort詳解

    python數組排序方法之sort、sorted和argsort詳解

    這篇文章主要給大家介紹了關于python數組排序方法之sort、sorted和argsort的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-03-03
  • DJango的創(chuàng)建和使用詳解(默認數據庫sqlite3)

    DJango的創(chuàng)建和使用詳解(默認數據庫sqlite3)

    今天小編就為大家分享一篇DJango的創(chuàng)建和使用詳解(默認數據庫sqlite3),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11

最新評論

惠安县| 铁岭县| 蒲江县| 黄梅县| 崇州市| 江孜县| 墨竹工卡县| 综艺| 涟水县| 海宁市| 德安县| 河南省| 通城县| 华安县| 清徐县| 镇宁| 延川县| 子长县| 永川市| 黄浦区| 赣州市| 集安市| 改则县| 汝城县| 行唐县| 象州县| 静乐县| 岑巩县| 缙云县| 乐都县| 鄱阳县| 称多县| 万安县| 加查县| 辉南县| 桂东县| 手机| 临湘市| 沙湾县| 郑州市| 永川市|