一、死锁现象与递归锁
进程也是有死锁的
所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,
它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,
如下就是死锁
1 死锁-------------------
2 from threading importThread,Lock,RLock
3 importtime
4 mutexA =Lock()
5 mutexB =Lock()
6 classMyThread(Thread):
7 defrun(self):
8 self.f1()
9 self.f2()
10 deff1(self):
11 mutexA.acquire()
12 print('\033[33m%s 拿到A锁 '%self.name)
13 mutexB.acquire()
14 print('\033[45%s 拿到B锁 '%self.name)
15 mutexB.release()
16 mutexA.release()
17 deff2(self):
18 mutexB.acquire()
19 print('\033[33%s 拿到B锁 ' %self.name)
20 time.sleep(1) #睡一秒就是为了保证A锁已经被别人那到了
21 mutexA.acquire()
22 print('\033[45m%s 拿到B锁 ' %self.name)
23 mutexA.release()
24 mutexB.release()
25 if __name__ == '__main__':
26 for i in range(10):
27 t =MyThread()
28 t.start() #一开启就会去调用run方法
那么怎么解决死锁现象呢?
解决方法,递归锁:在Python中为了支持在同一线程中多次请求同一资源,python提供了可重入锁RLock。
这个RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。
直到一个线程所有的acquire都被release,其他的线程才能获得资源。上面的例子如果使用RLock代替Lock,则不会发生死锁
1 # 2.解决死锁的方法--------------递归锁
2 from threading importThread,Lock,RLock
3 importtime
4 mutexB = mutexA =RLock()
5 classMyThread(Thread):
6 defrun(self):
7 self.f1()
8 self.f2()
9 deff1(self):
10 mutexA.acquire()
11 print('\033[33m%s 拿到A锁 '%self.name)
12 mutexB.acquire()
13 print('\033[45%s 拿到B锁 '%self.name)
14 mutexB.release()
15 mutexA.release()
16 deff2(self):
17 mutexB.acquire()
18 print('\033[