先寫乙個多執行緒的程式
import threading
import time
defjob1()
:global a
for i in
range(10
):a +=
1print
('job1'
,a)def
job2()
:global a
for i in
range(10
):a +=
10print
('job2'
,a)if __name__ ==
'__main__'
: a =
0 t1 = threading.thread(target=job1)
t2 = threading.thread(target=job2)
t1.start(
) t2.start(
) t1.join(
) t2.join(
)
執行結果:
job1 1
job1 2
job1 3
job1 4
job1 5
job1 6
job1 7
job2 17
job2 27job1
job2 38
job2 48
job2 58
job2 68
job2 78
job2 88
job2 98
28job1 99
job1 100
發現會出現問題。為什麼呢?因為使用了2個執行緒,每個執行緒都會對全域性資源a進行改寫操作,導致出現問題。由於多執行緒共享程序的資源和位址空間,因此,在對這些公共資源進行操作時,為了防止這些公共資源出現異常的結果,必須考慮執行緒的同步和互斥問題。
利用lock
import threading
defjob1()
:global a,lock
lock.acquire(
)for i in
range(10
):a +=
1print
('job1'
,a) lock.release(
)def
job2()
:global a,lock
lock.acquire(
)#加鎖
for i in
range(10
):a +=
10print
('job2'
,a) lock.release(
)#解鎖
if __name__ ==
'__main__'
: a =
0 lock = threading.lock(
)#建立乙個lock
t1 = threading.thread(target=job1)
t2 = threading.thread(target=job2)
t1.start(
) t2.start(
) t1.join(
) t2.join(
)
執行結果:
job1 1
job1 2
job1 3
job1 4
job1 5
job1 6
job1 7
job1 8
job1 9
job1 10
job2 20
job2 30
job2 40
job2 50
job2 60
job2 70
job2 80
job2 90
job2 100
job2 110
通過acquire()
和release()
函式來控制加鎖和解鎖。這樣每個thread對a進行改動期間,就不會有其它的thread插入進來改動a的值。
哦了。
python 多執行緒 鎖Lock
在上次講gil鎖的時候 位址 有講到gil鎖也會有釋放的時候,就會導致資料的錯誤讀訪問,10萬次左右可能不會有影響,然而量級大上去,結果就不再是零了。那麼如何解決這種問題呢?這裡引入lock from threading import lock a 0 lock lock def add fun g...
多執行緒 Lock
reentrantlock和synchronized區別 作用跟synchronized 鎖一樣 reentrantlock 底層是 cas 值,期望,預期 synchronized 底層鎖公升級 reentrantlock 可以trylock 嘗試鎖 a.如果在某時間段內獲取到鎖,就執行 b.如果...
C 多執行緒Lock
一.為什麼要lock,lock了什麼?當我們使用 執行緒的時候,效率最高的方式當然是 非同步,即各個執行緒同時執行,其間不相互依賴和等待。但當不同的執行緒都需要訪問某個資源的時候,就需要 同步機制 了,也就是說當對同乙個資源進行讀寫的時候,我們要使該資源在同一時刻只能被乙個執行緒操作,以確保每個操作...