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

Cpython解釋器中的GIL全局解釋器鎖

 更新時間:2020年11月09日 10:51:57   作者:Sg、  
這篇文章主要介紹了Cpython解釋器中的GIL全局解釋器鎖的相關(guān)資料,幫助大家更好的了解Cpython解釋器,感興趣的朋友可以了解下

1、什么是GIL全局解釋器鎖

  GIL:Global Interpreter Lock,意思就是全局解釋器鎖,這個GIL并不是Python的特性,他是只在Cpython解釋器里引入的一個概念,而在其他的語言編寫的解釋器里就沒有GIL,例如:Jython,Pypy等

  下面是官方給出的解釋:

In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython's memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.)

  翻譯過來的意思就是:在CPython中,全局解釋器鎖(GIL)是一個互斥鎖,可以防止多個本地線程同時執(zhí)行Python字節(jié)碼。這個鎖是必要的,主要是因為CPython的內(nèi)存管理不是線程安全的。(但是,由于GIL存在,其他特性已經(jīng)發(fā)展到依賴于它所執(zhí)行的保證。)

  所以:

    GIL本質(zhì)上就是一把互斥鎖,用來保證數(shù)據(jù)的正確性,使數(shù)據(jù)可以正常同步。

    GIL就像是BUG一般存在的全局互斥鎖,目前無法通過代碼去除GIL

  結(jié)論:在CPython解釋器中,在同一個進(jìn)程下開啟的多線程,同一時刻只能有一個線程執(zhí)行,無法利用多核優(yōu)勢

  PS:我們平常所使用的python是C語言編寫的,所以大部分人所說的python也指CPython,CPython是python的官方版本,若是指其他語言寫的python,一般情況下會指明,如Jypthon、Pypy等

2、為什么會出現(xiàn)GIL

  隨著電腦多核CPU的出現(xiàn),python為了充分利用多核CPU,進(jìn)行多線程的編程方式便普及了起來,但是隨之而來的困難是線程之間數(shù)據(jù)的一致性和狀態(tài)同步,python為了解決這個數(shù)據(jù)不能同步的問題,所以設(shè)計了GIL全局解釋器鎖,其實就是互斥鎖

  說到互斥鎖,在多線程互斥鎖中共享全局變量的時候會有線程對全局變量進(jìn)行的資源競爭,會對全局變量的修改產(chǎn)生不是我們想要的結(jié)果,而那個時候用到的是python中線程模塊里面的互斥鎖。

  如下例(未加線程互斥鎖):

from threading import Threadimport time


n = 100
def task():
  global n
  m = n
  time.sleep(0.5)  # 模擬IO操作
  n = m - 1


if __name__ == '__main__':
  list1 = []
  for i in range(10):
    t = Thread(target=task)
    t.start()
    list1.append(t)

  for t in list1:
    t.join()

  print(n)

 執(zhí)行結(jié)果:

99

  在上面的例子里,我創(chuàng)建了10個線程來爭奪對 n 進(jìn)行 -1 操作,但是結(jié)果并非我想要的,所以我在這里加入了互斥鎖

  如下例(加線程互斥鎖):

from threading import Thread
from threading import Lock
import time


n = 100
def task(lock):
  global n
  lock.acquire()  # 加鎖
  m = n
  time.sleep(0.5)  # 模擬IO操作
  n = m - 1
  lock.release()  # 解鎖


if __name__ == '__main__':
  list1 = []
  lock = Lock()
  for i in range(10):
    t = Thread(target=task, args=(lock, ))
    t.start()
    list1.append(t)

  for t in list1:
    t.join()

  print(n)

  執(zhí)行結(jié)果:

90

  這次就可以得到我想要的結(jié)果

3、GIL的優(yōu)缺點

  優(yōu)點:

    保證數(shù)據(jù)的正確性

  缺點:

    單個進(jìn)程下,開啟多個線程,犧牲了執(zhí)行效率,無法實現(xiàn)并行,只能實現(xiàn)并發(fā)

4、如何體現(xiàn)GIL全局解釋器鎖

  在Cpython解釋器中,當(dāng)python代碼有一個線程開始訪問解釋器的時候,GIL會把這個大鎖給鎖上,此時此刻其他的線程只能干等著,無法對解釋器的資源進(jìn)行訪問,這一點就和互斥鎖相似。而只是這個過程發(fā)生在我們的Cpython中,同時也需要等這個線程分配的時間到了,這個線程把GIL釋放掉,類似互斥鎖的lock.release()一樣,另外其他的線程才開始跑起來。

以上就是Cpython解釋器中的GIL全局解釋器鎖的詳細(xì)內(nèi)容,更多關(guān)于GIL全局解釋器鎖的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python報錯TypeError: ‘NoneType‘ object is not subscriptable的解決方法匯總

    Python報錯TypeError: ‘NoneType‘ object is 

    在Python編程中,TypeError 是一個常見的錯誤,它表明代碼中存在類型不匹配的問題,TypeError: 'NoneType' object is not subscriptable 是一個具體的例子,本文將探討這個錯誤的原因,并提供幾種解決方案,需要的朋友可以參考下
    2024-10-10
  • Python實現(xiàn)把utf-8格式的文件轉(zhuǎn)換成gbk格式的文件

    Python實現(xiàn)把utf-8格式的文件轉(zhuǎn)換成gbk格式的文件

    這篇文章主要介紹了Python實現(xiàn)把utf-8格式的文件轉(zhuǎn)換成gbk格式的文件,本文給出了實現(xiàn)代碼并同時剖析了代碼的作用,需要的朋友可以參考下
    2015-01-01
  • python 字符串轉(zhuǎn)列表 list 出現(xiàn)\ufeff的解決方法

    python 字符串轉(zhuǎn)列表 list 出現(xiàn)\ufeff的解決方法

    下面小編就為大家?guī)硪黄猵ython 字符串轉(zhuǎn)列表 list 出現(xiàn)\ufeff的解決方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Python字典一個key對應(yīng)多個value幾種實現(xiàn)方式

    Python字典一個key對應(yīng)多個value幾種實現(xiàn)方式

    python中字典的健和值是一一對應(yīng)的,如果對字典進(jìn)行添加操作時如果健的名字相同,則當(dāng)前健對應(yīng)的值就會被覆蓋,有時候我們想要一個健對應(yīng)多個值的場景,這篇文章主要給大家介紹了關(guān)于Python字典一個key對應(yīng)多個value幾種實現(xiàn)方式的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • 最新評論

    鹰潭市| 瓦房店市| 鹤山市| 延安市| 吴川市| 鄂温| 张家川| 扎鲁特旗| 中超| 宁南县| 株洲市| 岳西县| 常熟市| 永靖县| 修武县| 桃园县| 阜南县| 略阳县| 福贡县| 汤阴县| 平利县| 漳浦县| 铜山县| 广德县| 兴城市| 巴彦淖尔市| 承德县| 新邵县| 广河县| 石门县| 萝北县| 武乡县| 休宁县| 南郑县| 淮滨县| 辉南县| 廊坊市| 湘乡市| 克拉玛依市| 澄城县| 平湖市|