1.定義
gil(global_interpreter_lock)全域性直譯器鎖:
在cpython中,gil是乙個互斥鎖,為了防止多個本地執行緒在同一時間執行python位元組碼,因為cpython中的記憶體管理是非執行緒安全的,而cpython中的很多特性都依賴於這個特性.
2.cpython直譯器與python程式之間的關係
python程式本質就是一堆字串,所以執行乙個python程式時 必須要開啟開啟乙個直譯器
但是在乙個python程式中直譯器只有乙個 所有**都要交給它來解釋執行
當有多個執行緒都要執行**時就會產生執行緒安全問題
3.cpython直譯器與gc(垃圾**執行緒)的問題
python會自動幫我們處理垃圾 清掃垃圾也是一對** 也需要開啟乙個執行緒來執行
也就是說就算程式沒有自己開啟執行緒 內部也有多個執行緒
gc執行緒與我們程式中的執行緒就會產生安全問題
例如: 執行緒1 要定義乙個變數a=10
步驟:1.申請記憶體空間,
2.資料存入空間(變數值的引用計數為0)
若此時,cpu切換到gc程序,將會出發垃圾**機制
3.引用計數+1
4.帶來的問題
gil是一把互斥鎖,降低效率:具體表現是 在cpython 即便開啟了多執行緒 而且cpu也是多核的 卻無法並行執行任務;因為直譯器只有乙個 同一時間只能有乙個任務在執行 .
5.如何解決
無徹底辦法解決,只能盡可能的避免gil鎖影響我們的效率
1.使用多程序能夠實現並行,從而更好的利用多核cpu
2.對任務進行區分
任務可以分為兩類
1.計算密集型 基本沒有io 大部分時間都在計算 例如人臉識別 影象處理
由於多執行緒不能並行 應該使用多程序 將任務分給不同cpu核心
2.io密集型 計算任務非常少,大部分時間都在等待io操作
由於網路io速度對比cpu處理速度非常慢, 多執行緒並不會造成太大的影響
另外如有大量客戶端連線服務 程序根本開不起來 只能用多執行緒
6.關於效能的討論
之所以加鎖是為了解決執行緒安全問題
由於有了鎖 導致cpython中多執行緒不能並行只能併發
但是我們不能因此否認python
1.python是一門語言 ,gil是cpython直譯器的問題
2.如果是單核cpu ,gil不會造成任何影響
3. 由於目前大多數程式都是基於網路的,網路速度對比cpu是非常慢的, 導致即使多核cpu也無法提高效率
4. 對於io密集型任務 不會有太大的影響
5.如果沒有這把鎖 我們程式猿將必須自己來解決安全問題
#效能測試
#計算密集型(多程序強於多執行緒)
from multiprocessing import process
from threading import thread
import time
def task():
for i in range(100000000):
1+1if __name__ == '__main__':
start = time.time()
ps =
for i in range(5):
# p = process(target=task) #耗時:9.214441299438477
# p =thread(target=task) #耗時:16.144373178482056
p.start()
for i in ps:i.join()
#計時print(time.time()-start)
# io密集型任務(頻繁的使用者互動和開啟檔案等費時操作)
def task():
for i in range(100):
with open(r"1.死鎖現象.py",encoding="utf-8") as f:
f.read()
if __name__ == '__main__':
start_time = time.time()
ps =
for i in range(10):
p = process(target=task)
# p = thread(target=task)
p.start()
for i in ps:i.join()
print("共耗時:",time.time()-start_time)
# 多執行緒勝於多程序
7.gil於自定義鎖的區別
gil鎖住的是直譯器級別的資料
自定義鎖,鎖的是直譯器以外的共享資源 例如:硬碟上的檔案 控制台
對於這種不屬於直譯器的資料資源就應該自己加鎖處理
併發程式設計之執行緒的讀寫鎖
1.概念 2.讀寫鎖的狀態 3.讀寫鎖特性 4.讀寫鎖的適用場景 5.主要資料型別和應用函式 6.編碼舉例 讀寫鎖實際上是一種特殊的自旋鎖,它把共享資源的訪問劃分成讀者和寫者,讀者只能擁有對共享資源的讀許可權,寫者則需要對共享資源進行寫操作。讀寫鎖並不是兩把鎖,它是乙個名字叫做讀寫鎖的鎖,可以擁有讀...
python之路 併發程式設計之程序 互斥鎖
互斥鎖 將多個任務對修改共享資料的操作由併發變為 序列 沒有互斥鎖的情況下 json檔案 執行檔案 import os import time import json import random from multiprocessing import process def check with o...
Go併發程式設計之美之互斥鎖
一 前言 go語言類似j a juc包也提供了一些列用於多執行緒之間進行同步的措施,比如低階的同步措施有 鎖 cas 原子變數操作類。相比j a來說go提供了獨特的基於通道的同步措施。本節我們先來看看go中互斥鎖 二 互斥鎖 互斥鎖是獨佔鎖,同時只有乙個執行緒可以獲取該鎖,其他執行緒則會被阻塞掛起,...