1. 程式人生 > >Python的全域性鎖(GIL)問題

Python的全域性鎖(GIL)問題

CPU-bound(計算密集型) 和I/O bound(I/O密集型)

計算密集型任務(CPU-bound) 的特點是要進行大量的計算,佔據著主要的任務,消耗CPU資源,一直處於滿負荷狀態。比如複雜的加減乘除、計算圓周率、對視訊進行高清解碼等等,全靠CPU的運算能力。這種計算密集型任務雖然也可以用多工完成,但是任務越多,花在任務切換的時間就越多,CPU執行任務的效率就越低,所以,要最高效地利用CPU,計算密集型任務同時進行的數量應當等於CPU的核心數。

計算密集型任務由於主要消耗CPU資源,因此,程式碼執行效率至關重要。Python這樣的指令碼語言執行效率很低,完全不適合計算密集型任務。對於計算密集型任務,最好用C語言編寫。

IO密集型任務(I/O bound)的特點是指磁碟IO、網路IO佔主要的任務,CPU消耗很少,任務的大部分時間都在等待IO操作完成(因為IO的速度遠遠低於CPU和記憶體的速度)。

IO密集型任務執行期間,99%的時間都花在IO上,花在CPU上的時間很少,因此,用執行速度極快的C語言替換用Python這樣執行速度極低的指令碼語言,完全無法提升執行效率。

對於IO密集型任務,任務越多,CPU效率越高,但也有一個限度。常見的大部分任務都是IO密集型任務,比如請求網頁、讀寫檔案等。當然我們在Python中可以利用sleep達到IO密集型任務的目的。

對於IO密集型任務,最合適的語言就是開發效率最高(程式碼量最少)的語言,指令碼語言是首選,C語言最差。

全域性鎖問題:

直譯器被一個全域性直譯器鎖保護著,它確保任何時候都只有一個Python執行緒執行。

GIL最大的問題就是Python的多執行緒程式並不能利用多核CPU的優勢 (比如一個使用了多個執行緒的計算密集型程式只會在一個單CPU上面執行)。

GIL只會影響到那些嚴重依賴CPU的程式(比如計算型的)

如果你的程式大部分只會設計到I/O,比如網路互動,那麼使用多執行緒就很合適, 因為它們大部分時間都在等待。實際上,你完全可以放心的建立幾千個Python執行緒, 現代作業系統執行這麼多執行緒沒有任何壓力,沒啥可擔心的。

解決方案:

首先,如果你完全工作於Python環境中,你可以使用 multiprocessing 模組來建立一個程序池, 並像協同處理器一樣的使用它。

pool = None

# Performs a large calculation (CPU bound)
def some_work(args):
    ...
    return result

def some_thread():
    while True:
        ...
        r = pool.apply(some_work, (args))
        ...

# Initiaze the pool
if __name__ == '__main__':
    import multiprocessing
    pool = multiprocessing.Pool()

另外一個解決GIL的策略是使用C擴充套件程式設計技術。 主要思想是將計算密集型任務轉移給C,跟Python獨立,在工作的時候在C程式碼中釋放GIL。

相關推薦

Python全域性(GIL)問題

CPU-bound(計算密集型) 和I/O bound(I/O密集型) 計算密集型任務(CPU-bound) 的特點是要進行大量的計算,佔據著主要的任務,消耗CPU資源,一直處於滿負荷狀態。比如複雜的加減乘除、計算圓周率、對視訊進行高清解碼等等,全靠CPU的運

關於python的執行緒和GIL全域性的一些見解

GIL全域性鎖是:Python語言和GIL沒有半毛錢關係。僅僅是由於歷史原因在Cpython虛擬機器(直譯器),難以移除GIL.每個執行緒在執行的過程都需要先獲取GIL,保證同一時刻只有一個執行緒可以執行程式碼。作用就是保證同一時刻只有一個執行緒可以執行程式碼,造成了我們使用多執行緒的時候無法實

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

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

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

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

Python最難的問題——直譯器全域性GIL

Python的底層 要理解GIL的含義,我們需要從Python的基礎講起。像C++這樣的語言是編譯型語言,所謂編譯型語言,是指程式輸入到編譯器,編譯器再根據語言的語法進行解析,然後翻譯成語言獨立的中間表示,最終連結成具有高度優化的機器碼的可執行程式。編譯器之所以可以深層次的對程式碼進行優化,是因為它可以看到

python高性能編程--002--全局解釋器GIL

GIL一、GIL基本概念1.GIL即為gloabl interpreter lock,全局解釋器鎖。這個東西是在python解釋器之一的cpython中引入的一個概念,因為我們現在常用的python解釋器就是cpython這個解釋器,故而GIL就在python中經常被提及。在JPython這個python解釋

python 全局解釋GIL

bsp 依賴 兩種 只有一個 但是 使用 解釋 虛擬機 主動 Python的全局解釋器鎖GIL用於保護python解釋器,使得任意時刻,只有一個線程在解釋器中運行。從而保證線程安全 在多線程環境中,Python 虛擬機按以下方式執行: 1. 設置GIL2. 切換到一個線程去

全域性直譯器GIL

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

Python如何規避全局解釋器(GIL)帶來的限制

介紹 span 得到 例如 一是 https -s glob 核心 編程語言分類概念介紹(編譯型語言、解釋型語言、靜態類型語言、動態類型語言概念與區別) https://www.cnblogs.com/zhoug2020/p/5972262.html Python解

Python中的多執行緒程式設計,執行緒安全與(一) 聊聊Python中的GIL 聊聊Python中的GIL python基礎之多執行緒機制 python--threading多執行緒總結 Python3入門之執行緒threading常用方法

1. 多執行緒程式設計與執行緒安全相關重要概念 在我的上篇博文 聊聊Python中的GIL 中,我們熟悉了幾個特別重要的概念:GIL,執行緒,程序, 執行緒安全,原子操作。 以下是簡單回顧,詳細介紹請直接看聊聊Python中的GIL  GIL:&n

[python]執行緒GIL

#gil global interpreter lock (cpython) #python中一個執行緒對應於c語言中的一個執行緒 #gil使得同一個時刻只有一個執行緒在一個cpu上執行位元組碼, 無法將多個執行緒對映到多個cpu上執行 #gil會根據執行的位

GIL執行緒全域性

1.GIL概述 GIL ( Global Interperter Lock ) 稱作全域性直譯器鎖。首先需要明確一點,我們所講的 GIL 並不是 Python 語言的特性,它是在實現 Python 直譯器時引用的一個概念。GIL 只在CPython 直譯器上存在。 2.GIL優缺點 優點

python網路程式設計--執行緒(,GIL,守護執行緒)

1.執行緒   1.程序與執行緒 程序有很多優點,它提供了多道程式設計,讓我們感覺我們每個人都擁有自己的CPU和其他資源,可以提高計算機的利用率。很多人就不理解了,既然程序這麼優秀,為什麼還要執行緒呢?其實,仔細觀察就會發現程序還是有很多缺陷的,主要體現在兩點上:   程序只能在一個時間幹一件事,如果想

python 執行緒(建立2種方式,守護程序,,死,遞迴,GIL,其他方式)

###############總結############ 執行緒建立的2種方式(重點) 程序:資源分配單位    執行緒:cpu執行單位(實體) 執行緒的建立和銷燬的開銷特別小 執行緒之間資源共享,是同一個程序中的資源共享,會涉及到安全問題,所以需要加鎖解決 鎖:犧牲

python 線程(創建2種方式,守護進程,,死,遞歸,GIL,其他方式)

num oba reading div append global tmp sin 所有 ###############總結############ 線程創建的2種方式(重點) 進程:資源分配單位 線程:cpu執行單位(實體) 線程的創建和銷毀的開銷特別小 線程之間資

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

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

Python---全域性直譯器

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

你是否真的瞭解全域性解析(GIL)

關於我 一個有思想的程式猿,終身學習實踐者,目前在一個創業團隊任team lead,技術棧涉及Android、Python、Java和Go,這個也是我們團隊的主要技術棧。 Github:https://github.com/hylinux1024 微信公眾號:終身開發者(angrycode) 0x00 什

python-Lock線程同步和互斥

() print b+ != val threading true pytho color 1 #!/usr/bin/python 2 #coding=utf-8 3 #線程間通信的同步與互斥操作-鎖 4 import threading 5 a=b=0 6

全局解釋器--GIL

print safety 整體 cpu 操作系統 connect png -a add 參考博客:https://www.cnblogs.com/mindsbook/archive/2009/10/15/thread-safety-and-GIL.html