資源總是有限的,程式執行如果對同乙個物件進行操作,則有可能造成資源的爭用,甚至導致死鎖
也可能導致讀寫混亂
鎖提供如下方法:
1.lock.acquire([blocking])
2.lock.release()
3.threading.lock() 載入執行緒的鎖物件,是乙個基本的鎖物件,一次只能乙個鎖定,其餘鎖請求,需等待鎖釋放後才能獲取
例如:
無鎖:
#coding=utf8
import threading
import time
num = 0
defsum_num
(i):
global num
time.sleep(1)
num +=i
print num
print
'%s thread start!'%(time.ctime())
try:
for i in range(6):
t =threading.thread(target=sum_num,args=(i,))
t.start()
except keyboardinterrupt,e:
print
"you stop the threading"
print
'%s thread end!'%(time.ctime())
輸出:
sun
may 28 20:54
:59 2017 thread
start!
sunmay 28 20:54
:59 2017 thread
end!013
71015
結果顯示混亂
引入鎖:
#coding=utf8
import threading
import time
num = 0
defsum_num
(i):
lock.acquire()
global num
time.sleep(1)
num +=i
print num
lock.release()
print
'%s thread start!'%(time.ctime())
try:
lock=threading.lock()
list =
for i in range(6):
t =threading.thread(target=sum_num,args=(i,))
t.start()
for threadinglist in list:
threadinglist.join()
except keyboardinterrupt,e:
print
"you stop the threading"
print
'%s thread end!'%(time.ctime())
結果:
sun
may 28 21:15
:37 2017 thread
start!01
361015
sunmay 28 21:15
:43 2017 thread
end!
其中:
lock=threading.lock()載入鎖的方法也可以換成lock=threading.rlock()
如果將上面的sum_num修改為:
lock.acquire()
global num
lock.acquire()
time.sleep(1)
num +=i
lock.release()
print num
lock.release()
那麼:
lock=threading.lock() 載入的鎖,則一直處於等待中,鎖等待
而lock=threading.rlock() 執行正常
Python基礎 多執行緒與Lock鎖
python的執行緒是真正的posix thread,而不是模擬出來的執行緒。python的標準庫提供了兩個模組 thread低階模組和threading高階模組 重點 執行示例 由於任何程序預設就會啟動乙個執行緒,我們把該執行緒稱為主線程,主線程又可以啟動新的執行緒,python的threadin...
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.如果...