詳解Python GIL
首先讓我們瞭解一下併發和並行的概念:什麼是併發什麼是並行,他們的區別是什麼?
舉個簡單的例子:
你吃飯吃到一半,電話來了,你一直到吃完了以後才去接,這就說明你不支援併發也不支援並行.
你吃飯吃到一半,電話來了,你停了下來接了電話,接完後電話以後繼續吃飯,這說明你支援併發。
你吃飯吃到一半,電話來了,你一邊打電話一邊吃飯,這說明你支援並行。
並行與併發的理解
併發:交替處理多個任務的能力;
並行:同時處理多個任務的能力;
併發的關鍵是你有處理多個任務的能力,不一定要同時。
並行的關鍵是你有同時處理多個任務的能力,強調的是同時.
所以它們最大的區別就是:是否是『同時』處理任務。
對於一個多核cpu來說並行顯然要比並發快的多
由此我們可以知道一個多核cpu在處理多個任務的時候如果想要發揮最大功效就要實現並行
那我們在使用多執行緒和多程式來寫程式的時候就是為了讓多核cup發揮他最大的功效實現並行,
也就是我們面試題參考答案的結果
程式碼驗證多程式,多執行緒對cpu的使用情況
1.多執行緒實驗
子執行緒死迴圈
import threading
def test():
while True:
pass
t1 = threading.Thread(target=test)
t1.start()
2.主執行緒死迴圈
while True:
pass
3.多程式
import multiprocessing
def deadLoop():
while True:
pass
子程式死迴圈
p1 = multiprocessing.Process(target=deadLoop)
p1.start()
主程式死迴圈
deadLoop()
通過程式碼可以發現 多程式可以充分使用cpu的兩個核心 而多執行緒卻不能充分使用cpu的兩個核心
問題 : 通過驗證我們發現多執行緒並不能真正的讓多核cpu實現並行。
原因 :
cpython直譯器中存在一個GIL(全域性直譯器鎖),他的作用就是保證同一時刻只有一個執行緒可以執行程式碼,
因此造成了我們使用多執行緒的時候無法實現並行。
解決方案法 :
1:更換直譯器 比如使用jpython(java實現的python直譯器)
2:使用多程式完成多工的處理
GIL(全域性直譯器鎖)
常見GIL面試題如下
描述Python GIL的概念, 以及它對python多執行緒的影響?編寫一個多執行緒抓取網頁的程式,
並闡明多執行緒抓取程式是否可比單執行緒效能有提升,並解釋原因。
Guido的宣告:點選開啟連結
he language doesn't require the GIL -- it's only the CPython virtual machine that has historically
been unable to shed it.
參考答案:
Python語言和GIL沒有半毛錢關係。僅僅是由於歷史原因在Cpython虛擬機器(直譯器),難以移除GIL。
GIL:全域性直譯器鎖。每個執行緒在執行的過程都需要先獲取GIL,保證同一時刻只有一個執行緒可以執行程式碼。
執行緒釋放GIL鎖的情況: 在IO操作等可能會引起阻塞的system call之前,可以暫時釋放GIL,但在執行完畢後,
必須重新獲取GIL Python 3.x使用計時器(執行時間達到閾值後,當前執行緒釋放GIL)或Python 2.x,tickets計數
達到100
Python使用多程式是可以利用多核的CPU資源的。
多執行緒爬取比單執行緒效能有提升,因為遇到IO阻塞會自動釋放GIL鎖
結論:
1. 在 處理像科學計算 這類需要持續使用cpu的任務的時候 單執行緒會比多執行緒快
2. 在 處理像IO操作等可能引起阻塞的這類任務的時候 多執行緒會比單執行緒
--------------------- 本文來自 my_qq_990814268 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/liangkaiping0525/article/details/79490323?utm_source=copy
相關文章
- python進階(16)深入瞭解GIL鎖(最詳細)Python
- Python3 原始碼閱讀-深入瞭解Python GILPython原始碼
- Python GIL(Global Interpreter Lock)Python
- Python中如何切換GIL?Python
- 你見過Python的GIL嗎Python
- Python多執行緒與GIL鎖Python執行緒
- 對 Python 中 GIL 的一點理解Python
- python GIL的使用及弊端處理Python
- Python GIL(全域性直譯器鎖)Python
- GIL在python的獲取和釋放Python
- Python列表詳解Python
- Python @property 詳解Python
- 你是否真的瞭解全域性解析鎖(GIL)
- Python協程詳解Python
- python操作Redis詳解PythonRedis
- Python self用法詳解Python
- Python元組詳解Python
- python模組詳解Python
- python中dict詳解Python
- Python 之 itertools 詳解Python
- Python培訓教程:什麼是Python全域性直譯器鎖(GIL)?Python
- Python 官方研討會:徹底移除 GIL 真的可行麼?Python
- Python中的Super詳解Python
- Python中的列表詳解Python
- 詳解Python中的程式Python
- Python Pandas的使用 !!!!!詳解Python
- python socket函式詳解Python函式
- python中list切片詳解Python
- Python裝飾器詳解Python
- Python中字典使用詳解Python
- Python 潮流週刊#24:no-GIL 提案正式被採納了!Python
- Python正規表示式詳解Python
- Python中協程(coroutine)詳解Python
- Python中Numpy函式詳解Python函式
- Python - poetry(3)配置項詳解Python
- Python之time模組詳解Python
- python單例的使用詳解Python單例
- Python - __slots__屬性詳解Python