死锁和递归锁
一、死锁
[1]关于死锁
- 死锁是指两个或多个进程,在执行过程中,因争夺资源而造成了互相等待的一种现象。
- 即两个或多个进程持有各自的锁并试图获取对方持有的锁,从而导致被阻塞,不能向前执行,最终形成僵局。
- 在这种情况下,系统资源利用率极低,系统处于一种死循环状态。
[2]示例
from threading import Thread, Lock
import time
metexA = Lock()
metexB = Lock()
# 类只要加括号多次 产生的肯定不同的对象
# 如果你想要实现多次加括号等到的是相同的对象 - 单例模式
class MyThread(Thread):
def run(self):
self.func1()
self.func2()
def func1(self):
metexA.acquire()
# self.name:获取当前线程名
print(f'{self.name} 抢到了A锁')
metexB.acquire()
print(f'{self.name} 抢到了B锁')
metexB.release()
metexA.release()
def func2(self):
metexB.acquire()
# self.name:获取当前线程名
print(f'{self.name} 抢到了B锁')
time.sleep(2)
metexA.acquire()
print(f'{self.name} 抢到了A锁')
metexA.release()
metexB.release()
def main():
for i in range(10):
t = MyThread()
t.start()
if __name__ == '__main__':
main()
二、递归锁
[1]关于递归锁
- 递归锁(也叫可重入锁)是一种特殊的锁,它允许一个线程多次请求同一个锁,称为“递归地”请求锁
- 在该线程释放锁之前,会对锁计数器进行累加操作,线程每成功获得一次锁时,都要进行相应的解锁操作,直到锁计数器清零才能完全释放该锁。
- 递归锁能够保证同一线程在持有锁时能够再次获取该锁,而不被自己所持有的锁所阻塞,从而避免死锁的发生。
- 但是注意要正常使用递归锁,避免过多地获取锁导致性能下降。
[2]示例
from multiprocessing import Process
from threading import Thread, Lock, RLock
import time
# 两个变量同时指向一把锁
metexA = metexB = RLock()
# 类只要加括号多次 产生的肯定不同的对象
# 如果你想要实现多次加括号等到的是相同的对象 - 单例模式
class MyThread(Thread):
def run(self):
self.func1()
self.func2()
def func1(self):
metexA.acquire()
# self.name:获取当前线程名
print(f'{self.name} 抢到了A锁')
metexB.acquire()
print(f'{self.name} 抢到了B锁')
metexB.release()
print(f'{self.name} 释放了B锁')
metexA.release()
print(f'{self.name} 释放了A锁')
def func2(self):
metexB.acquire()
# self.name:获取当前线程名
print(f'{self.name} 抢到了A锁')
time.sleep(2)
metexA.acquire()
print(f'{self.name} 抢到了B锁')
metexA.release()
print(f'{self.name} 释放了A锁')
metexB.release()
print(f'{self.name} 释放了B锁')
def main():
for i in range(3):
t = MyThread()
t.start()
if __name__ == '__main__':
main()
标签:metexA,name,递归,metexB,self,死锁,print
From: https://www.cnblogs.com/taoyuanshi/p/18124737