理解Python中的鎖

2021-10-01 18:33:48 字數 2916 閱讀 8165

一、全域性直譯器鎖(global interpreter lock,gil)

1.什麼是全域性直譯器鎖

2.全域性直譯器鎖的好處

3.全域性直譯器鎖的缺點

import time

import threading

defsub()

:global num

num -=

1 time.sleep(1)

num =

100# 定義乙個全域性變數

l =[

]for i in

range

(100):

t = threading.thread(target=sub)

# 每次迴圈開啟乙個執行緒

t.start(

)# 開啟執行緒

for i in l:

i.join(

)# 加上join保證所有執行緒結束後才執行下面**

print

(num)

>>

>

0# 輸出為0

二、同步鎖

1.什麼是同步鎖

2.為什麼用同步鎖

3.怎麼使用同步鎖

import time

import threading

r = threading.lock(

)def

sub():

global num

r.acquire(

)# 加鎖,保證同一時刻只有乙個執行緒可以修改資料

num -=

1 r.release(

)# 修改完成就可以解鎖

time.sleep(1)

num =

100# 定義乙個全域性變數

l =[

]for i in

range

(100

):

t = threading.thread(target=sub)

# 每次迴圈開啟乙個執行緒

t.start(

)# 開啟執行緒

# 將執行緒加入列表l

for i in l:

i.join(

)# 這裡加上join保證所有的執行緒結束後才執行下面的**

print

(num)

>>

>

0

4.擴充套件知識

三、遞迴鎖和死鎖

1.什麼是死鎖

指兩個或兩個以上的執行緒或程序在執行程式的過程中,因爭奪資源而相互等待的乙個現象。

2.什麼是遞迴鎖

在python中為了支援同乙個執行緒中多次請求同一資源,python提供了可重入鎖。這個rlock內部維護著乙個lock和counter變數,counter記錄了acquire的次數,從而使得資源可以被多次require。直到乙個執行緒所有acquire都被release,其他的執行緒才能獲得資源。

import time

import threading

a = threading.rlock(

)# 這裡設定鎖為遞迴鎖

class

obj(threading.thread)

:def

__init__

(self)

:super()

.__init__(

)def

run(self)

: self.a(

) self.b(

)def

a(self)

:# 遞迴鎖,就是將多個鎖的鑰匙放到一起,要拿就全拿,要麼乙個都拿不到

# 以實現鎖

a.acquire(

)print

('123'

)print

(456

) time.sleep(1)

print

('qweqwe'

) a.release(

)def

b(self)

: a.acquire(

)print

('asdfaaa'

)print

('(⊙o⊙)哦(⊙v⊙)嗯'

) a.release(

)for i in

range(2

):t = obj(

) t.start(

)

四、訊號量(semaphore)

1.同程序的一樣,semaphore管理乙個內建的計數器,每當呼叫acquire()時內建內容-1,每當呼叫release()時內建函式+1。計數器不能為0,當計數器為0時acquire()將阻塞執行緒,直到其他執行緒呼叫release()。

import threading

import time

mysf = threading.semaphore(5)

# 建立訊號量物件,(5表示這個鎖同時支援的個數)

deffunc()

:if mysf.acquire():

# 因為使用了訊號量,下面的輸出就會5個5個的同時輸出

print

(threading.currentthread(

).getname()+

' get semaphore'

) time.sleep(1)

mysf.release(

)for i in

range(20

):t = threading.thread(target=func)

t.start(

)

參考文獻:

MYSQL中鎖的理解

鎖是幹嘛的?是為了保證資料庫當中資料的一致性,併發情況下事務操作經常會發生對同一條資料進行操作,導致我們讀寫發生異常。有以下幾種情況 髒寫 寫寫操作 a修改了資料,b也修改了資料,b回滾,那個a的修改也不能生效。這種情況很嚴重,基本任何事務隔離級別都會杜絕這種情況 髒讀 寫讀 b開啟事務,修改改了一...

python鎖 python中的各種鎖

一 全域性直譯器鎖 gil 1 什麼是全域性直譯器鎖 在同乙個程序中只要有乙個執行緒獲取了全域性直譯器 cpu 的使用許可權,那麼其他的執行緒就必須等待該執行緒的全域性直譯器 cpu 使 用權消失後才能使用全域性直譯器 cpu 即時多個執行緒直接不會相互影響在同乙個程序下也只有乙個執行緒使用cpu,...

Python中GIL全域性直譯器鎖的理解

gil的全稱是 global interpreter lock,意思就是全域性直譯器鎖,gil並不是python的特性,只在cpython直譯器裡引入的乙個概念,而在其他的語言編寫的直譯器裡就沒有這個gil例如 jpthon import threading 子執行緒死迴圈 def test whi...