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多线程死锁现象解决的资料请关注脚本之家其它相关文章!

相关文章

  • linux环境打包python工程为可执行程序的过程

    linux环境打包python工程为可执行程序的过程

    本次需求,在ubuntu上面开发的python代码程序需要打包成一个可执行程序然后交付给甲方,因为不能直接给源码给甲方,所以寻找方法将python开发的源码打包成一个可执行程序,本次在ubuntu上打包python源码的方法和在window上打包的有点类似,感兴趣的朋友跟随小编一起看看吧
    2024-01-01
  • 基于pytorch实现对图片进行数据增强

    基于pytorch实现对图片进行数据增强

    图像数据增强是一种在训练机器学习和深度学习模型时常用的策略,尤其是在计算机视觉领域,具体而言,它通过创建和原始图像稍有不同的新图像来扩大训练集,本文给大家介绍了如何基于pytorch实现对图片进行数据增强,需要的朋友可以参考下
    2024-01-01
  • Python 第三方opencv库实现图像分割处理

    Python 第三方opencv库实现图像分割处理

    这篇文章主要介绍了Python 第三方opencv库实现图像分割处理,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-06-06
  • 利用rest framework搭建Django API过程解析

    利用rest framework搭建Django API过程解析

    这篇文章主要介绍了利用rest framework搭建Django API过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Python实现把json格式转换成文本或sql文件

    Python实现把json格式转换成文本或sql文件

    这篇文章主要介绍了Python实现把json格式转换成文本或sql文件,本文直接给出代码实例,需要的朋友可以参考下
    2015-07-07
  • 浅析Python中的变量赋值与多重赋值

    浅析Python中的变量赋值与多重赋值

    在 Python 中,变量赋值是编程中常见的操作之一,本文将深入探讨 Python 中的变量赋值和多重赋值,包括其基本语法、特性、应用场景以及示例代码,需要的可以参考下
    2024-03-03
  • 利用Python语言的grpc实现消息传送详解

    利用Python语言的grpc实现消息传送详解

    gRPC是一个高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计。本文主要介绍了如何利用Python语言的grpc实现消息传送,感兴趣的可以了解一下
    2023-03-03
  • 使用Python随机生成数据的方法

    使用Python随机生成数据的方法

    这篇文章主要介绍了使用Python随机生成数据的方法,在日常开发中竟然会遇到需要测试大量数据的地方,那么随机生成数据就可以有效的加快我们的效率,通过Python_Faker生成测试数据需要安装Faker包,需要的朋友可以参考下
    2023-10-10
  • Python生成随机密码的方法

    Python生成随机密码的方法

    这篇文章主要为大家详细介绍了Python生成随机密码的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • python制图之小提琴图示例代码

    python制图之小提琴图示例代码

    这篇文章主要介绍了python制图之小提琴图的相关资料,提琴图结合箱线图和核密度估计,展示数据分布和概率密度,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-03-03

最新评论