#### 死锁 互斥锁 递归锁
from threading import Lock,Thread,RLock #递归锁
importtime
noddle_lock=Lock()
kuaizi_lock=Lock()defeat1(name):
noodle_lock.acquire()#上锁
print("%s拿到面条了" %(name))
kuaizi_lock.acquire()#上锁
print("%s拿到筷子了"%(name))print("开始享受这碗面条...")
time.sleep(0.5)
kuaizi_lock.acquire()#解锁
print("%s放下裤子了"%(name))
noddle_lock.release()print("%s放下面条了"%(name))defeat2(name):
kuaizi_lock.acquire()print("%s拿到筷子了"%(name))
noddle_lock.acquire()print("%s拿到面条了"%(name))print("开始享受这碗面条了...")
time.sleep(0.5)
noddle_lock.release()print("%s放下面条了"%(name))
kuaizi_lock.release()print("%s放下筷子了"%(name))if __name__ == '__main__':
name_lst1= ['王振','小白']
name_lst2= ['刘伟','小林']for name inname_lst1:
Thread(target=eat1,args=(name,)).start()for name inname_lst2:
Thread(target=eat2,args=(name,)).start()#上面的代码就是死锁
#(2) 递归锁 解决线上bug 上锁和解锁要保持一对,递归锁连续上锁连续解锁也不会变成死锁,而互斥锁就不可以
'''作用:
递归锁专门用来解决死锁现象
是临时用于快速解决项目因死锁问题不能正常运行的场景
用来处理异常死锁的
rlock =RLock() #创建一个对象 上锁后再上一把锁,然后再解锁,不会变成死锁
lock = Lock() #互斥锁没遇到release就会变成死锁,即使你上锁后又上了一把锁,然后再解锁,也是死锁
def func():
#lock上锁后下面必须跟解锁,下面的代码是阻塞状态,只上锁不解锁 死锁
lock.acquire() #下面两把锁是同一个对象,一个对象连续上锁就会造成死锁
lock.acquire()
print(333)
lock.release()
lock.release()
#下面代码正常执行
rlock.acquire()
rlock.acquire()
print(111)
rlock.release()
rlock.release()
print(222)
func()'''
#(3) 用递归锁解决死锁
noodle_lock =Lock()
kuaizi_lock=Lock()
noodle_lock.acquire()#这两把锁是不同对象,所有不会造成死锁,上面代码造成死锁是同一个对象
kuaizi_lock.acquire()print(1)
noodle_lock.release()
kuaizi_lock.release()print(2)#递归锁解决死锁
noodle_lock = kuaiz_lock = RLock() #是一把递归锁
defeat1(name):
noodle_lock.acquire()#上锁
print("%s拿到面条了"%(name))
kuaizi_lock.acquire()#上锁
print("%s拿到筷子了"%s(name))print("开始享受这碗面条...")
time.sleep(0.5)
kuaizi_lock.release()#解锁
print("%s放下筷子了"%(name))
noodle_lock.release()print("%s放下面条了"%(name))defeat2(name):
kuaizi_lock.acquire()print("%s拿到筷子了"%(name))
noodle_lock.acquire()#上锁
print("%s拿到面条了"%(name))print("开始享受这碗面条...")
time.sleep(0.5)
noodle_lock.release()print("%s放下面条了"%(namne))
kuaizi_lock.release()#解锁
print("%s放下筷子了"%(name))if __name__ == '__main__':
name_lst1= ["王振","小白"]
name_lst2= ["刘伟","小林"]for name inname_lst1:
Thread(target=eat1,args=(name,)).start()for name inname_lst2:
Thread(target=eat2,args=(name,)).start()#(4) 互斥锁 让拿筷子和吃面条绑定成一个整体,#尽量使用一把锁解决问题,不要互相嵌套,否则容易死锁
mylock =Lock()defeat1(name):
mylock.acquire()#上锁
print("%s拿到面条了"%(name))print("%s拿到筷子了"%(name))print("开始享受这碗面条...")
time.sleep(0.5)print("%s放下筷子了"%(name))print("%s放下面条了"%(name))
mylock.release()#解锁
defeat2(name):
mylock.acquire()#上锁
print("%s拿到筷子了"%(name))print("%s拿到面条了"%(name))print("开始享受这碗面条...")
time.sleep(0.5)print("%s放下面条了"%(name))print("%s放下筷子了"%(name))
mylock.release()if __name__ == '__main__':
name_lst1= ["王振","小白"]
name_lst2= ["刘伟","小林"]for name inname_lst1:
Thread(target=eat1,args=(name,)).start()for name inname_lst2:
Thread(target=eat2,args=(name,)).start()