python 多執行緒 鎖Lock

2021-09-27 11:24:24 字數 1030 閱讀 5720

在上次講gil鎖的時候(位址 ),

有講到gil鎖也會有釋放的時候,就會導致資料的錯誤讀訪問,10萬次左右可能不會有影響,然而量級大上去,結果就不再是零了。那麼如何解決這種問題呢?

這裡引入lock

from threading import lock

a = 0

lock = lock()

def add_fun():

global a

global lock

for i in range(1000000):

lock.acquire()

a += 1

lock.release()

def desc_fun():

global a

for i in range(1000000):

lock.acquire()

a -= 1

lock.release()

import threading

t1 = threading.thread(target=add_fun)

t2 = threading.thread(target=desc_fun)

t1.start()

t2.start()

t1.join() # join: 主線程等待全部子執行緒結束才完成自己的任務

t2.join()

print(a) # 執行結果0

為什麼會用到鎖呢,在web電商專案中,買賣商品必然會有減庫存的操作,而在多執行緒併發情況下,多個執行緒會同時訪問庫存並修改庫存,如果同時修改就會出現多賣的情況。當然我們可以從資料庫層面來解決,比如樂觀鎖,修改資料庫的事務隔離級別等等,這些下回我再寫。

同一時刻當然只能有乙個python執行緒得以執行,但是當這個執行緒正在操作某個資料結構時,其他執行緒可能也會打斷它,python直譯器在執行兩個連續的位元組命令時。其他執行緒可能會在他執行中途插入,如果是多個執行緒同時執行上述的操作,就會引發危險的結果,一旦發生就會破壞程式的狀態,從而使相關的資料結構無法保證其一致性。

隔了好久,墮怠。。

Python多執行緒學習4 執行緒鎖lock

不使用 lock 的情況 函式一 全域性變數a的值每次加1,迴圈10次,並列印 def job1 global a for i in range 10 a 1 print job1 a 函式二 全域性變數a的值每次加10,迴圈10次,並列印 def job2 global a for i in ra...

Python基礎 多執行緒與Lock鎖

python的執行緒是真正的posix thread,而不是模擬出來的執行緒。python的標準庫提供了兩個模組 thread低階模組和threading高階模組 重點 執行示例 由於任何程序預設就會啟動乙個執行緒,我們把該執行緒稱為主線程,主線程又可以啟動新的執行緒,python的threadin...

python多執行緒程式設計與學習(鎖Lock)

你需要對多執行緒程式中的臨界區加鎖以避免競爭條件。例如只有一台印表機,但卻有兩個以上的輸入程式,這個時候印表機就是競爭資源。如何解決,給印表機上鎖,使用印表機時上鎖,使用完解鎖。在python中使用 threading 庫中的 lock 物件 用with語句,更加方便,自動獲取鎖,自動釋放,這樣可以...