Python多執行緒中鎖的基本概念

2021-10-06 17:11:52 字數 2429 閱讀 1405

最近複習了下多執行緒中鎖的知識,發現網路上好多篇博文介紹多執行緒中鎖的概念時都很含糊其辭,一筆就帶過了。而且更要命的地方在於幾乎都將鎖與資源放在一起介紹,讓我看得雲裡霧裡的,看得是十分頭疼。這篇文章就單獨說下鎖的基本概念,其餘高階應用可以去那些部落格看看。

首先要明確的一點就是:鎖跟資源其實是不相干的。多執行緒中的鎖是乙個全域性變數例項,它的作用等同於乙個標誌位。其具體用法為,在全部需要加鎖的資源處,在修改前對鎖進行鎖定,修改完後釋放鎖。當乙個執行緒對鎖進行鎖定後,其餘執行緒執行對鎖進行鎖定的操作時就會進入阻塞狀態,直至鎖被釋放,然後由多個執行緒對該鎖進行搶奪。搶奪到鎖的執行緒將鎖進行鎖定,然後對資源進行修改,其餘未搶奪到鎖的執行緒則繼續處於阻塞狀態。

用**來闡述就是

import time

from datetime import datetime

from threading import thread, lock

resource =

0resourcelock = lock(

)def

modify()

: resourcelock.acquire(

)print

(f'child thread 1 get lock time: '

f'') time.sleep(3)

global resource

resource +=

3print

(f'child thread 1 modify resource time: '

f' resource: '

)print

(f'child thread 1 release lock time: '

f'') resourcelock.release(

)def

modify_2()

: time.sleep(1)

global resource

resource +=

100print

(f'child thread 2 modify resource time: '

f' resource: '

)def

modify_3()

: resourcelock.acquire(

)print

(f'child thread 3 get lock time: '

f'') time.sleep(1)

global resource

resource +=

2print

(f'child thread 3 modify resource time: '

f' resource: '

)print

(f'child thread 3 release lock time: '

f'') resourcelock.release(

)def

main()

: child_thread_1 = thread(target=modify)

child_thread_2 = thread(target=modify_2)

child_thread_3 = thread(target=modify_3)

child_thread_1.start(

) child_thread_2.start(

) child_thread_3.start(

) time.sleep(6)

print

(f'main thread exit time: '

f'')if __name__ ==

'__main__'

: main(

)

其執行結果為

child thread 1 get lock time: 14:32:13

child thread 2 modify resource time: 14:32:14 resource: 100

child thread 1 modify resource time: 14:32:16 resource: 103

child thread 1 release lock time: 14:32:16

child thread 3 get lock time: 14:32:16

child thread 3 modify resource time: 14:32:17 resource: 105

child thread 3 release lock time: 14:32:17

main thread exit time: 14:32:19

可以看到子執行緒1即使搶占了鎖,子執行緒2還是可以修改資源變數。而與此同時,因為子執行緒1搶占了鎖,子執行緒3進入了阻塞狀態,直至子執行緒1釋放了鎖。

python多執行緒鎖 python的多執行緒程式設計之鎖

1 背景概述 在python中,要保證資料的正確性,並且自己對資料進行控制,對資料進行加鎖並且自己釋放鎖。多執行緒的主要目的為了提高效能與速度,用在無關的方向是最好的,例如在使用爬蟲的時候,可以使用多執行緒來進行爬取資料,因為在這些執行緒之間沒有需要共同操作的資料,從而在這個時候利用是最好的。如果需...

python 多執行緒 鎖

參考 python cookbook 12章 啟動和停止執行緒 start 啟動執行緒 is alive 判斷是否已經結束 join 請求連線某個執行緒,等待該執行緒結束,才退出join函式 daemon引數,守護執行緒,該執行緒無法被連線,主線程結束後自動銷毀。2.7不適用 終止執行緒 需要自己構...

多執行緒中的鎖

導致死鎖的原因 有兩個或多個執行緒需要在幾個共享物件上獲取鎖,這可能會導致死鎖。thread1 object1 object2 thread2 object2 object1 死鎖的四個條件 1.互斥條件 2.不可剝奪條件 3.請求與保持條件 4.迴圈等待條件 解決方式 1.避免滿足產生死鎖的四個條...