鎖機制
在了解鎖機制前,我們先來看一下下面這個例子:
## 使用多執行緒進行加法運算
import threading
# 定義全域性變數value
value = 0
# 定義加法執行緒函式
def add_value():
global value
for x in range(1000000):
value += 1
print('value = ', value)
# 定義兩個執行緒併發執行加法操作
def add_thread_main():
for x in range(2):
t = threading.thread(target=add_value)
t.start()
if __name__ == '__main__':
add_thread_main()
"""output:
value = 1147074
value = 1211397
"""
上面的示例按照我們的邏輯看來應該是依次輸出1000000和2000000,但結果並不是這樣的,這就是常說的多執行緒共享全域性變數問題。其實在我們執行執行緒時,執行的順序是不一定的,也就是說有時候可能重合在一起執行,因而導致有時雖二者都對共享變數進行了一次加法(即本應加兩次)而實際上只真正加了一次。
而為了解決這樣的問題,threading模組提供了乙個lock類,這個類可以在某個執行緒訪問某個變數的時候加鎖,其他執行緒此時不能訪問該變數,直到加鎖執行緒處理完控制變數並把鎖釋放了,其他執行緒才能進行訪問處理。鎖機制使用起來也很簡單,由於是多個執行緒訪問共享變數,因而需設定乙個全域性的lock類物件,然後在訪問前後分別使用lock類的acquire()方法加鎖和release()方法釋放鎖。
上述例子使用鎖機制僅需做以下幾處的修改:
## 使用多執行緒進行加法運算
import threading
# 定義全域性變數value
value = 0
glock = threading.lock()
# 定義加法執行緒函式
def add_value():
global value
glock.acquire()
for x in range(100000):
value += 1
print('value = ', value)
glock.release()
# 定義兩個執行緒併發執行加法操作
def add_thread_main():
for x in range(4):
t = threading.thread(target=add_value)
t.start()
if __name__ == '__main__':
add_thread_main()
「」」output:
value = 100000
value = 200000
value = 300000
value = 400000
"""
**: python多執行緒鎖 python的多執行緒程式設計之鎖
1 背景概述 在python中,要保證資料的正確性,並且自己對資料進行控制,對資料進行加鎖並且自己釋放鎖。多執行緒的主要目的為了提高效能與速度,用在無關的方向是最好的,例如在使用爬蟲的時候,可以使用多執行緒來進行爬取資料,因為在這些執行緒之間沒有需要共同操作的資料,從而在這個時候利用是最好的。如果需...
python 多執行緒 鎖
參考 python cookbook 12章 啟動和停止執行緒 start 啟動執行緒 is alive 判斷是否已經結束 join 請求連線某個執行緒,等待該執行緒結束,才退出join函式 daemon引數,守護執行緒,該執行緒無法被連線,主線程結束後自動銷毀。2.7不適用 終止執行緒 需要自己構...
python執行緒互斥鎖 Python多執行緒與互斥鎖
多執行緒 threading python的thread模組是 較底層的模組,python的threading 模組是對thread做了 些包裝的,可以更加 便的被使 1.使 threading模組 from threading import thread 匯入模組 t thread target ...