併發程式設計之GIL鎖

2022-02-15 04:03:09 字數 2442 閱讀 6605

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中互斥鎖 二 互斥鎖 互斥鎖是獨佔鎖,同時只有乙個執行緒可以獲取該鎖,其他執行緒則會被阻塞掛起,...