最近複習了下多執行緒中鎖的知識,發現網路上好多篇博文介紹多執行緒中鎖的概念時都很含糊其辭,一筆就帶過了。而且更要命的地方在於幾乎都將鎖與資源放在一起介紹,讓我看得雲裡霧裡的,看得是十分頭疼。這篇文章就單獨說下鎖的基本概念,其餘高階應用可以去那些部落格看看。
首先要明確的一點就是:鎖跟資源其實是不相干的。多執行緒中的鎖是乙個全域性變數例項,它的作用等同於乙個標誌位。其具體用法為,在全部需要加鎖的資源處,在修改前對鎖進行鎖定,修改完後釋放鎖。當乙個執行緒對鎖進行鎖定後,其餘執行緒執行對鎖進行鎖定的操作時就會進入阻塞狀態,直至鎖被釋放,然後由多個執行緒對該鎖進行搶奪。搶奪到鎖的執行緒將鎖進行鎖定,然後對資源進行修改,其餘未搶奪到鎖的執行緒則繼續處於阻塞狀態。
用**來闡述就是
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.避免滿足產生死鎖的四個條...