互斥鎖:犧牲了執行效率而獲得資料安全
問題:
# 多個執行緒搶占資源,會發生資料混亂
from threading import thread
import os,time
def work():
global n
temp=n
time.sleep(0.1)
n=temp-1
if __name__ == '__main__':
n=100
l=for i in range(100):
p=thread(target=work)
p.start()
for p in l:
p.join()
print(n) #結果可能為99
解決:
# 引入鎖(lock)的介入,一把鑰匙配一把鎖
from threading import thread,lock
import os,time
def work():
global n
lock.acquire()
temp=n
time.sleep(0.1)
n=temp-1
lock.release()
if __name__ == '__main__':
lock=lock()
n=100
l=for i in range(100):
p=thread(target=work)
p.start()
for p in l:
p.join()
print(n) #結果肯定為0,由原來的併發執行變成序列,犧牲了執行效率保證了資料安全
死鎖:
# 這時fork的鎖拿到了一些資源,noodle拿到了一些資源,互不相讓,造成死鎖
import time
from threading import thread,lock
fork_lock = noodle_lock = lock()
fork_lock.acquire()
print(222)
noodle_lock.acquire()
print(333)
fork_lock.release()
noodle_lock.release()
print(111)
遞迴鎖:解決死鎖
import time
from threading import thread,rlock
fork_lock = noodle_lock = rlock()
def eat1(name):
# 死鎖就是noodle_lock搶到的鑰匙也能開啟下面的fork_lock
noodle_lock.acquire()
print('%s 搶到了麵條111'%name)
fork_lock.acquire()
print('%s 搶到了叉子222'%name)
print('%s 吃麵333'%name)
fork_lock.release()
noodle_lock.release()
def eat2(name):
# 這個相當於跟上面的遞迴鎖是同一級的,所以上面搶到了,這個必須等到上述遞迴鎖的counter為0
# 也就是所有的資源都release掉了之後,才釋放資源
fork_lock.acquire()
print('%s 搶到了叉子555' % name)
time.sleep(1)
noodle_lock.acquire()
print('%s 搶到了麵條666' % name)
print('%s 吃麵777' % name)
noodle_lock.release()
fork_lock.release()
for name in ['哪吒','egon','yuan']:
t1 = thread(target=eat1,args=(name,))
t2 = thread(target=eat2,args=(name,))
t1.start()
t2.start()
互斥鎖遞迴鎖及死鎖現象
from threading import lock,rlock lock 互斥鎖 效率高 rlock 遞迴 recursion 鎖 效率相對低 l lock l.acquire print 希望被鎖住的 l.release rl rlock 在同乙個執行緒中可以被acquire多次 rl.acqu...
鎖 互斥鎖,死鎖
當多個執行緒幾乎同時修改某乙個共享資料的時候,需要進行同步控制 執行緒同步能夠保證多個執行緒安全訪問競爭資源,最簡單的同步機制是引入互斥鎖。互斥鎖為資源引入乙個狀態 鎖定 非鎖定 某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為 鎖定 其他執行緒不能更改 直到該執行緒釋放資源,將資源的狀態變...
python 互斥鎖,死鎖
同步與非同步之間的區別 1.同步 可以理解為執行緒a和b一塊配合工作,a執行到一定程度時要依靠b的某個結 果,於是停下來示意b執行,b執行完將結果給a,然後a繼續執行。2.非同步 非同步是指程序不需要一直等待下去,而是繼續執行下面的操作,不管其他程序的狀態,當有資訊返回的時候會通知程序進行處理,這樣...