python queue死锁_Python学习【第24篇】:死锁,递归锁,信号量,Event事件,线程Queue...

本文详细探讨了Python中的死锁现象,并通过示例展示了如何使用递归锁RLock解决死锁问题。此外,还介绍了信号量Semaphore、Event事件、定时器Timer以及线程Queue等多线程同步工具的使用方法。
摘要由CSDN通过智能技术生成

一、死锁现象与递归锁

进程也是有死锁的

所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,

它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,

如下就是死锁

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[

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值