python多线程死锁现象及解决方法

 更新时间:2022年07月01日 11:48:49   作者:程序媛_lisa  
这篇文章主要为大家介绍了python多线程死锁现象与解决方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

本节重点

了解死锁现象与解决方法

本节时长需控制在15分钟内

一 死锁现象

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

此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,如下就是死锁

from threading import Thread,Lock
import time
mutexA=Lock()
mutexB=Lock()
class MyThread(Thread):
    def run(self):
        self.func1()
        self.func2()
    def func1(self):
        mutexA.acquire()
        print('\033[41m%s 拿到A锁\033[0m' %self.name)
        mutexB.acquire()
        print('\033[42m%s 拿到B锁\033[0m' %self.name)
        mutexB.release()
        mutexA.release()
    def func2(self):
        mutexB.acquire()
        print('\033[43m%s 拿到B锁\033[0m' %self.name)
        time.sleep(2)
        mutexA.acquire()
        print('\033[44m%s 拿到A锁\033[0m' %self.name)
        mutexA.release()
        mutexB.release()
if __name__ == '__main__':
    for i in range(10):
        t=MyThread()
        t.start()

执行效果

Thread-1 拿到A锁
Thread-1 拿到B锁
Thread-1 拿到B锁
Thread-2 拿到A锁 #出现死锁,整个程序阻塞住

二 递归锁

解决方法,递归锁,在Python中为了支持在同一线程中多次请求同一资源,python提供了可重入锁RLock。

这个RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。

上面的例子如果使用RLock代替Lock,则不会发生死锁,二者的区别是:递归锁可以连续acquire多次,而互斥锁只能acquire一次

from threading import Thread,RLock
import time
mutexA=mutexB=RLock() #一个线程拿到锁,counter加1,该线程内又碰到加锁的情况,则counter继续加1,这期间所有其他线程都只能等待,等待该线程释放所有锁,即counter递减到0为止
class MyThread(Thread):
    def run(self):
        self.func1()
        self.func2()
    def func1(self):
        mutexA.acquire()
        print('\033[41m%s 拿到A锁\033[0m' %self.name)
        mutexB.acquire()
        print('\033[42m%s 拿到B锁\033[0m' %self.name)
        mutexB.release()
        mutexA.release()
    def func2(self):
        mutexB.acquire()
        print('\033[43m%s 拿到B锁\033[0m' %self.name)
        time.sleep(2)
        mutexA.acquire()
        print('\033[44m%s 拿到A锁\033[0m' %self.name)
        mutexA.release()
        mutexB.release()
if __name__ == '__main__':
    for i in range(10):
        t=MyThread()
        t.start()

以上就是python多线程死锁现象与解决方法的详细内容,更多关于python多线程死锁现象解决的资料请关注脚本之家其它相关文章!

相关文章

  • PyQt5 QThread倒计时功能的实现代码

    PyQt5 QThread倒计时功能的实现代码

    这篇文章主要介绍了PyQt5 QThread倒计时功能的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • python 使用shutil复制图片的例子

    python 使用shutil复制图片的例子

    今天小编就为大家分享一篇python 使用shutil复制图片的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • pandas添加新列的5种常见方法

    pandas添加新列的5种常见方法

    pandas为DataFrame格式数据添加新列的方法非常简单,下面这篇文章主要给大家介绍了关于pandas添加新列的5种常见方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • python3 中的几种除法介绍,小数的不同显示

    python3 中的几种除法介绍,小数的不同显示

    这篇文章主要介绍了python3 中的几种除法介绍,小数的不同显示,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • LyScript寻找ROP漏洞指令片段的方法详解

    LyScript寻找ROP漏洞指令片段的方法详解

    ROP可以理解成一个可以关闭系统自身内存保护的一段机器指令。本文将利用LyScript寻找ROP漏洞指令片段,感兴趣的小伙伴可以了解一下
    2022-07-07
  • python二分法查找实例代码

    python二分法查找实例代码

    二分算法是一种效率比较高的查找算法,其输入的是一个有序的元素列表,如果查找元素包含在列表中,二分查找返回其位置,否则返回NONE,下面这篇文章主要给大家介绍了关于python二分法查找的相关资料,需要的朋友可以参考下
    2021-11-11
  • python实现获取电脑所连接的wifi密码

    python实现获取电脑所连接的wifi密码

    电脑连接wifi后,很难直观地看到当前连接wifi的密码,需要借助命令行公管局才可以查看到相关信息,本文为大家介绍一下如何利用python获取电脑所连接的wifi密码,感兴趣的可以了解下
    2023-11-11
  • python删除指定列或多列单个或多个内容实例

    python删除指定列或多列单个或多个内容实例

    这篇文章主要介绍了python删除指定列或多列单个或多个内容实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python微信库:itchat的用法详解

    Python微信库:itchat的用法详解

    本篇文章主要介绍了Python微信库:itchat的用法详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • python的常见命令注入威胁

    python的常见命令注入威胁

    不过下面可是我们开发产品初期的一些血淋淋的案例,更多的安全威胁可以看看北北同学的《python hack》PPT,里面提及了不只命令执行的威胁,那些都是我们亲身经历的代码
    2013-02-02

最新评论