1. 程式人生 > >Python---全域性直譯器鎖

Python---全域性直譯器鎖

全域性直譯器鎖(Global Interpreter Lock ): 在 Python 語言的主流實現 CPython 中,GIL 是一個貨真價實的全域性執行緒鎖,在直譯器解釋執行任何 Python 程式碼時,都需要先獲得這把鎖才行,在遇到 I/O 操作時會釋放這把鎖。如果是純計算的程式,沒有 I/O 操作,直譯器會每隔 100 次操作就釋放這把鎖,讓別的執行緒有機會執行(這個次數可以通過 sys.setcheckinterval 來調整)。所以雖然 CPython 的執行緒庫直接封裝作業系統的原生執行緒,但 CPython 程序做為一個整體,同一時間只會有一個獲得了 GIL 的執行緒在跑,其它的執行緒都處於等待狀態等著 GIL 的釋放。即全域性直譯器鎖保證同一時間只有一個執行緒在執行。

在多執行緒環境中,GIL用法:
1. 設定GIL
2. 切換到一個執行緒去執行
3. 執行:
    a. 指定數量的位元組碼指令
    b. 執行緒主動讓出控制(可以呼叫time.sleep(0))
4. 把執行緒設定為睡眠狀態
5. 解鎖GIL

6. 再次重複以上所有步驟

例子:計算50個執行緒的執行個數

(1)未加鎖之前:

import threading,time

def run(n):
    #lock.acquire()    #獲取鎖
global num
    time.sleep(0.5)
    num+=1
#time.sleep(1)
    #lock.release()  #釋放鎖
#lock=threading.Lock()
num=0 t_obj=[] for i in range(50): t=threading.Thread(target=run,args=("t-%s"%i,)) t.start() t_obj.append(t) for t in t_obj: t.join() print("----all thread has done....") print("num:",num)

在Python 2.x中答案:num可能會小於50. 原因:同一時間可能有多個執行緒在執行。而num只是加1.

(2)加鎖處理:

import threading,time

def run(n):
    lock.acquire()    #
獲取鎖 global num time.sleep(0.5) num+=1 time.sleep(1) lock.release() #釋放鎖 lock=threading.Lock() num=0 t_obj=[] for i in range(50): t=threading.Thread(target=run,args=("t-%s"%i,)) t.start() t_obj.append(t) for t in t_obj: t.join() print("----all thread has done....") print("num:",num)
答案准確,num為50.

注意:在Python 3.x中答案:num始終為50.原因:直譯器自己優化,內部已經加鎖,保證同一時間只有一個執行緒在執行。

相關推薦

python 全域性直譯器(GIL)的問題

GIL即全域性直譯器鎖,是屬於直譯器層面的互斥鎖,確切的說是CPython直譯器內部的一把鎖。GIL是為了鎖定整個直譯器內部的全域性資源,每個執行緒想要執行首先獲取GIL,而GIL本身又是一把互斥鎖,造成所有執行緒只能一個一個併發交替的執行。 GIL產生的背景 在CPyt

Python---全域性直譯器

全域性直譯器鎖(Global Interpreter Lock ): 在 Python 語言的主流實現 CPython 中,GIL 是一個貨真價實的全域性執行緒鎖,在直譯器解釋執行任何 Python 程式碼時,都需要先獲得這把鎖才行,在遇到 I/O 操作時會釋放這把鎖。如果是

python多執行緒和GIL全域性直譯器

1、執行緒     執行緒被稱為輕量級程序,是最小執行單元,系統排程的單位。執行緒切換需要的資源一般,效率一般。  2、多執行緒         在單個程式中同時執行多個執行緒完成不同的工作,稱為多執行緒 3、

關於python的GIL全域性直譯器的簡單理解

GIL是直譯器內部的一把鎖,確切一點說是CPython直譯器內部的一把鎖,所以要注意區分 這和我們在Python程式碼中使用執行緒鎖Lock並不是一個層面的概念。 1. GIL產生的背景: 在CPython解釋內部執行多個執行緒的時候,每個執行緒都需要直譯器內部申請相應

Python 多執行緒 多程序 全域性直譯器GIL join

Python 程式碼的執行由Python 虛擬機器(也叫直譯器主迴圈)來控制。Python 在設計之初就考慮到要在主迴圈中,同時只有一個執行緒在執行,就像單CPU 的系統中執行多個程序那樣,記憶體中可以存放多個程式,但任意時刻,只有一個程式在CPU 中執行。同樣地,雖然Py

python GIL全域性直譯器的理解

GIL的全稱是:Global Interpreter Lock,意思就是全域性直譯器鎖,這個GIL並不是python的特性,他是隻在Cpython直譯器裡引入的一個概念,而在其他的語言編寫的直譯器裡就沒有這個GIL例如:Jython,Pypy為什麼會有gil?:       

Python 執行速度慢原因之一一GIL(全域性直譯器)視覺化

因為它是GIL(全域性直譯器鎖) 現代計算機的 CPU 有多個核心,有時甚至有多個處理器。為了利用所有計算能力,作業系統定義了一個底層結構,叫做執行緒,而一個程序(例如 Chrome瀏覽器)能夠生成多個執行緒,通過執行緒來執行系統指令。這樣如果一個程序是要使用很多 CPU,

全域性直譯器GIL

解釋一下對GIL的理解?   GIL 又叫全域性直譯器鎖,首先說一點,Python語言與GIL全域性直譯器鎖沒有關係,僅僅是因為歷史原因,在cpython直譯器中還存在GIL難以移除。GIL是功能與效能權衡後的產物,它有著存在的合理性,也有著難以移除的歷史客觀因素。   為什麼存在GIL?

GIL全域性直譯器

併發:進行交替處理多件事情。 並行:多個cpu同時處理多個事,只在多核上能實現。  GIL是全域性解析器鎖,保證同一時刻只有一個執行緒可以使用cpu,讓我們的多執行緒沒辦法真正實現並行。 在一個程序中只有一個GIL鎖,那個執行緒拿到GIL就可以使用cpu 多個程序有多

python3.5全域性直譯器GIL-實現原理淺析

python3全域性直譯器鎖淺談 本文環境python3.5.2。 python全域性直譯器鎖 In CPython, the global interpreter lock, or GIL, is a mutex that prevents mul

GIL(全域性直譯器)

1. 單執行緒死迴圈在VMware虛擬軟體中將Ubuntu設定為單核cpu# 主執行緒死迴圈,佔滿cpu while True: pass 2. 多執行緒死迴圈在VMware虛擬軟體中將Ubuntu設定為雙核cpuimport threading #子執行緒死迴圈

網路程式設計之多執行緒——GIL全域性直譯器

網路程式設計之多執行緒——GIL全域性直譯器鎖 一、引子 定義: In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python b

python高階程式設計上— GIL全域性直譯器和深淺拷貝

①GIL:全域性直譯器鎖 1):python直譯器分為兩種,一種是C-pytohn ,另一種是JAVA-python 2):python語言和GIL沒有關係。GIL的造成是由於使用C-python直譯器造成的。由於90年代電腦沒有並行的多核電腦,因此C-python直譯器沒有考慮多執行緒的問

Python真正多執行緒之殤——GIT全域性解釋

- 多執行緒的理解: 多程序和多執行緒都可以執行多個任務,執行緒是程序的一部分。執行緒的特點是執行緒之間可以共享記憶體和變數,資源消耗少(不過在Unix環境中,多程序和多執行緒資源排程消耗差距不明顯,Unix排程較快),缺點是執行緒之間的同步和加鎖比較麻煩。 Python多執行緒的缺陷:

GIL物件(全域性直譯器)[面試題]

GIL鎖物件(全域性直譯器)[面試題] 描述Python 中GIL的概念, 以及它對python多執行緒的影響?編寫一個多執行緒抓取網頁的程式,並闡述多執行緒抓取程式是否比單執行緒單執行緒效能有提升,並解釋原因。 #1.多執行緒 #子執行緒死迴圈 import threadi

什麼是python全域性解釋(GIL)?

      我們所說的Python全域性解釋鎖(GIL)簡單來說就是一個互斥體(或者說鎖),這樣的機制只允許一個執行緒來控制Python直譯器。      這就意味著在任何一個時間點只有一個執行緒處於執行狀態。GIL對執行單執行緒任務的程式設計師們來說並沒什麼顯著影響,但是它成為了計算密集型(CPU-boun

python-day33--互斥

__name__ task 成功 opened sleep star c99 搶票 pid 鎖的意思就是:一個一個的執行 1 from multiprocessing import Process,Lock 2 import os 3 import time 4

Python線程

python 線程 線程鎖 多線程適用於IO密集型,多線程實現方式有兩種,詳見下方例子例子:import threadingclass MyThread(threading.Thread): def __init__(self, args): #使用super寫法,按照父類.方

python 線程

thread 有一個 鎖定 程序 可重入鎖 建立 多重 star threading   資源總是有限的,程序運行如果對同一個對象進行操作,則有可能造成資源的爭用,甚至導致死鎖,或者導致讀寫混亂,python中提供線程鎖對線程的調用進行控制   鎖提供如下方法:     

Python中死的形成示例及死情況的防止

程序 ast mon error: none args ria 在那 n) 死鎖示例搞多線程的經常會遇到死鎖的問題,學習操作系統的時候會講到死鎖相關的東西,我們用Python直觀的演示一下。死鎖的一個原因是互斥鎖。假設銀行系統中,用戶a試圖轉賬100塊給用戶b,與此同時用戶