python入门开发了解死锁现象与解决方法

Python 并发编程之死锁 在并发编程中,死锁指的是一种特定的情况,即无法取得进展,程序被锁定在其当前状态。在大多数情况下,这种现象是由于不同的锁对象(用于线程同步)之间缺乏协调,或者处理不当造成的。在这一节中,我们将讨论一个思想实验,通常被称为餐饮哲学家问题,以说明死锁的概念及其原因;从这里开始,你将学习如何在 Python 并发程序中模拟这个问题。本文首先介绍了并发编程中的经典问题——哲学家就餐问题,然后引出了死锁的概念及条件。然后给出了可能出现死锁的情况,并通过 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内功修炼007】:死锁现象与递归锁 文章目录一、前言二、死锁现象2.1什么是死锁2.2 死锁实例2.3死锁实例分析三、递归锁3.1 RLock和Lock的区别3.2 递归锁实例3.3 递归锁实例分析四、互斥锁总结 一、前言 线程互斥锁分为递归锁和非递归锁。 互斥锁默认是非递归锁 如果一个线程多次获取非递归锁,就会出现死锁现象 如果一个线程可以多次获取同一个递归锁,不会产生死锁。 二、死锁现象 2.1什么是死锁 指两个或两个以上... 阅读详情

相关推荐

c#多线程中用pythonnet库调用Python的方法(解决死锁问题)

由于pythonnet全局锁(Py.GIL())机制,默认情况下,c#调用python,在主线程中才能正常运行,不卡死.若在c#多线程中调用python,第会产生死锁问题.本文提供了解决死锁问题的解决方案.

qiangpi6057的博客 2843

Python系列之死锁现象和递归锁

死锁 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,如下就是死锁 不说了,上代码: from threading import Thread,Lock import time mutexA=Lock() mutexB=L...

Alvin 558

Python 详细分析死锁原因及对应解决方案

本文深入分析了Python并发编程中的死锁问题,从死锁的基本概念、四大必要条件(互斥、占有且等待、不可剥夺、循环等待)入手,结合资源分配图和等待图理论,解释了死锁的形成机制。通过Python代码示例展示了常见的死锁场景(如哲学家就餐问题和多线程资源竞争),并详细介绍了死锁检测算法(如银行家算法)及其Python实现。文章还提出了多种预防和解决死锁的策略,包括破坏必要条件、锁排序、超时重试等技术手段,最后给出了完整的案例演示和代码实现,帮助开发者构建高可用的并发程序。

闲人编程的博客 1184

Python 解决cmd窗口鼠标点击后挂起不执行问题(禁止快速编辑模式)

问题 用Python开发的无界面程序,执行过程在cmd黑窗口中打印信息时,有时,一不小心鼠标点到了黑窗口里,程序就挂起,不执行了,必须把焦点去除才能恢复执行,很是烦人。一番搜索之后找到个还算简单的解决方案,此处记下来,分享给有需要的小伙伴。 解决方案 把这几行代码加入到待执行程序中即可。 import ctypes kernel32 = ctypes.windll.kernel32 kernel32.SetConsoleMode(kernel32.GetStdHandle(-10), 128) 想要详细

浅醉樱花雨的专栏 3340

Python中多线程死锁问题的避免

策略适用场景注意事项固定锁顺序多锁竞争场景需全局统一锁的获取顺序超时机制可能发生短暂阻塞的场景平衡超时时间与系统响应速度队列化请求高并发资源访问引入队列可能降低吞吐量避免锁读多写少场景(如优先考虑无锁数据结构关键结论设计阶段:明确锁的边界和顺序,尽量使用不可变对象编码阶段:优先使用with语句和高级同步原语(如Queue测试阶段:通过压力测试和工具监控验证无死锁通过遵循这些原则,开发者可以显著降低Python多线程程序中的死锁风险。

shejizuopin的博客 1401

浅谈python锁与死锁问题

如果你学过操作系统,那么对于锁应该不陌生。锁的含义是线程锁,可以用来指定某一个逻辑或者是资源同一时刻只能有一个线程访问。这个很好理解,就好像是有一个房间被一把锁锁住了,只有拿到钥匙的人才能进入。每一个人从房间门口拿到钥匙进入房间,出房间的时候会把钥匙再放回到门口。这样下一个到门口的人就可以拿到钥匙了。这里的房间就是某一个资源或者是一段逻辑,而拿取钥匙的人其实指的是一个线程。 加锁的原因 我们明白了锁的原理,不禁有了一个问题,我们为什么需要锁呢,它在哪些场景当中会用到呢? 其实它的使用场景非常广,我们举一个非常简单的例子,就是淘宝买东西。我们都知道商家的库存都是有限的,卖掉一个少一个。假如说当前

chatGPT给出Python time.sleep()假死(挂起)的解决办法

使用time.sleep(),最好使用线程方法; 合理的引导chatGPT交流,能快速帮助我们解决问题。

肖永威的专栏 7088

CAN总线错误帧全解析:从数据包到硬件层的故障树分析

本文深入解析CAN总线错误帧的故障树分析方法,从数据包到硬件层全面剖析错误机制。通过物理层信号测试、数据链路层错误解码和应用层协议排查,提供系统化的诊断框架。结合CANoe配置和示波器波形分析,帮助工程师快速定位总线故障,提升系统可靠性。

weixin_26742753的博客 489

python—多线程之死锁

一、造成死锁的原因 1、在多线程程序中,死锁问题很大一部分是由于线程同时获取多个锁造成的。 2、在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。 3、尽管死锁很少发生,但一旦发生就会造成应用的停止响应。 二、产生死锁的四个原因 1、互斥条件:一个资源每次只能被一个线程使用。 2、请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放。3、不剥夺条件:线程已获得的资源,在末使用完之前,不能强行剥夺。 4、循环等待条件:若干线程之间形成一种头尾相接的循

python全栈 3827

从零构建MAVLink通信:PX4飞控与QGC的协议握手全解析

本文详细解析了PX4飞控与QGC地面站通过MAVLink协议进行通信的全过程,重点介绍了航点传输协议的状态机设计、INT类型消息的优化优势以及异常处理与调试技巧。通过实战案例和性能优化建议,帮助开发者高效构建无人机通信系统,提升数据传输效率与稳定性。

weixin_29209805的博客 505

推荐系统:NDCG评价指标及其Python实现方法

除了推荐任务,在二分类任务中,也可以计算该指标,代码如下: # ndcg def get_dcg(y_pred, y_true, k): #注意y_pred与y_true必须是一一对应的,并且y_pred越大越接近label=1(用相关性的说法就是,与label=1越相关) df = pd.DataFrame({"y_pred":y_pred, "y_true":y_true}) ...

lanyuelvyun的博客 8242

什么是死锁?死锁产生的条件?如何避免或解决死锁?深入探讨死锁以及它的成因及解决方案

简单来说,死锁(Deadlock)是一种现象,多个进程因为竞争资源而造成的相互等待的状态。这个状态下,每个进程都在等待其他进程释放资源,并且都无法继续执行,最终导致程序的停滞。可以想象成几个小船在某个狭窄水域中,彼此堵住,谁也无法前进。死锁是并发编程中不可避免的一个问题,但我们可以通过合理的设计、清晰的资源管理以及定期的健康检查来避免或解决它。希望这篇文章能够帮助大家更好地理解死锁的产生、条件以及应对策略,保障我们的应用程序能够正常、安全地运行。

智通全网络工作室的博客 3154

DRAM架构演进与HBM技术在高性能计算中的应用

DRAM(动态随机存取存储器)是现代计算系统中关键的内存技术,其架构优化直接影响数据供给能力。随着AI训练和科学计算等数据密集型负载的普及,传统DDR架构面临带宽墙、能效比和访问粒度等挑战。HBM(高带宽内存)通过3D堆叠技术(如TSV硅通孔)和异构集成(如PIM存内计算)显著提升了带宽和能效比。这些技术在高性能计算、AI推理和大模型训练等场景中展现出巨大潜力,例如HBM3的带宽可达819GB/s,能效比低至0.95pJ/b。未来,DRAM技术将继续向更高密度、更低功耗和更智能的内存计算方向发展。

weixin_35757191的博客 400

死锁现象与递归锁

一 死锁现象 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,如下就是死锁 from threading import Thread, Lock import time mutexA = Lock() mutex...

aizhui7038的博客 187

国产安全芯片在密码算法国密体系下的性能适配策略

国密体系即国家商用密码体系,是保障信息安全的核心技术体系。自20世纪90年代末起步,国密体系经历了从无到有、从弱到强的发展历程。1999年,国家密码管理局成立,标志着国密体系的正式建立。2000年,国密SM1算法首次发布,开启了国密算法的标准化进程。此后,SM2、SM3、SM4等算法陆续推出,形成了完整的对称与非对称密码算法体系。:2010年,国密标准正式纳入国家标准体系,国密算法在金融、政务、通信等关键领域的应用得到明确规范。

qq_40552871的博客 1356

Vue3 - 详细实现安装西瓜视频 xgplayer 插件详细配置及使用教程,利用西瓜视频播放器播放 mp4、flv、hls 格式视频文件及视频推流(直播或监控摄像头画面),支持移动端H5及PC网站!

vue3,nuxt3,西瓜视频,xgplayer,插件组件,xgplayer-hls,xgplayer-flv,xgplayer-mp4,播放视频点播和直播视频流,监控实时播放推流,倍速播放,在线flv在线推流地址,HLS播放,vue3西瓜播放器,vue如何使用西瓜视频插件做直播推流回流,视频点播,flv在线视频流播放,截图功能,自定义播放器样式,截屏,监控视频,vue3使用西瓜播放器播放flv、hls、mp4视频,截屏按钮,直播流,报错,黑屏,加载失败,苹果ios不兼容,重连,怎么改样式,很卡,详细教程,

🏆 前端领域优质创作者 1万+

对Python多线程死锁问题的巧妙解决方法

死锁 死锁的原理非常简单,用一句话就可以描述完。就是当多线程访问多个锁的时候,不同的锁被不同的线程持有,它们都在等待其他线程释放出锁来,于是便陷入了永久等待。比如A线程持有1号锁,等待2号锁,B线程持有2号锁等待1号锁,那么它们永远也等不到执行的那天,这种情况就叫做死锁。 关于死锁有一个著名的问题叫做哲学家就餐问题,有5个哲学家围坐在一起,他们每个人需要拿到两个叉子才可以吃饭。如果他们同时拿起自己左手边的叉子,那么就会永远等待右手边的叉子释放出来。这样就陷入了永久等待,于是这些哲学家都会饿死。 这是一个很

python学习者的博客 1040

别再无脑调打码平台了!聊聊 ddddocr 在爬虫验证码识别中的真实边界

ddddocr是国产开源社区的优秀成果,它大幅降低了验证码识别的入门门槛。工具的自由不等于工程的自由。真正的能力不在于“会不会调库”,而在于能否准确判断工具的适用边界、构建鲁棒的容错机制、并在成本与效果之间做出理性权衡。下次当你准备在爬虫中加入验证码识别时,不妨先问自己:这个站点的验证码类型是否在ddddocr的能力圈内?我的预处理是否针对该站点做过专项调试?我的失败重试和监控机制是否完备?如果三个问题都能肯定回答,那么ddddocr就是你的利器;如果有任何一个犹豫,请先补齐短板再上路。评论区交流:你用。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1281

Python死锁产生原因及解决方法

多线程安全问题:死锁

weixin_43764258的博客 1256

Oracle EBS Interface/API(42) -AP发票客制化付款申请

背景 在OA系统上,选择Oracle EBS的某张AP发票做付款申请,需要类似于锁定该发票以便付款,其他用户或者下次用户不能再次选择该发票做付款申请。 快速参考 参考点 内容 功能导航 N: AP->Invoices->Entry>Invoices 并发请求 None 基表 AP.AP_INV_SELECTION_CRITERIA_ALLAP.AP_SELECTED_INVOICES_ALL API 参考下面介绍 错误信息表 None 接口Form

陈显平的专栏-Oracle EBS 1200

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

python 并发编程 多线程 死锁现象与递归锁

一 死锁现象 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,如下就是死锁 from threading import Thread from threading import Lock import time ...

weixin_30580943的博客 156

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

死锁深度解析:原理、检测与解决之道

本文深入探讨了并发编程中的死锁问题及其解决方案。文章首先剖析了死锁的四个必要条件(互斥、持有并等待、不可剥夺、循环等待),并通过Python代码演示了典型死锁场景。随后系统介绍了四种预防策略:破坏互斥条件、一次性申请资源、允许资源剥夺和资源有序分配法。在死锁避免方面,详细讲解了银行家算法和资源分配图算法的实现原理。文章还提出了死锁检测与恢复技术,包括进程终止和资源剥夺策略。最后,结合Python实践,提供了上下文管理器封装、超时锁获取等防御性编程方法,并总结了行业最佳实践和工具链。全文为构建健壮的并发系统提

laozhangguzhang的博客 978

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Python学习,对Python多线程死锁问题的巧妙解决方法

死锁 死锁的原理非常简单,用一句话就可以描述完。就是当多线程访问多个锁的时候,不同的锁被不同的线程持有,它们都在等待其他线程释放出锁来,于是便陷入了永久等待。比如A线程持有1号锁,等待2号锁,B线程持有2号锁等待1号锁,那么它们永远也等不到执行的那天,这种情况就叫做死锁。 关于死锁有一个著名的问题叫做哲学家就餐问题,有5个哲学家围坐在一起,他们每个人需要拿到两个叉子才可以吃饭。如果他们同时拿起自己左手边的叉子,那么就会永远等待右手边的叉子释放出来。这样就陷入了永久等待,于是这些哲学家都会饿死。 ![这是一

sehun_sx的博客 1093

python中解决死锁的方法

1.添加超时时间: fromthreading import Thread, Lock importtime   mutex1= Lock()  # 创建一个互斥锁 mutex2= Lock()  # 创建一个互斥锁     def fun1():     while True:         mutex1.acquire()         print("线程1 锁

采菊东篱下,Python满乾坤! 4499

python死锁案例_死锁与递归锁

[TOC]**多进程好多线程都有死锁的问题**## 一 死锁现象所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,### 死锁案例-科学家吃面问题~~~import timefrom threading import Thread,Lockd...

weixin_39687786的博客 138

什么是死锁,如何避免在Python中出现死锁?

什么是死锁如何避免在Python中出现死锁

weixin_70682362的博客 839
上一篇: python入门开发学习笔记之掌握Cpython的GIL解释器锁的工作机制
下一篇: python入门开发学习笔记之了解什么是信号量Event定时器
程序员_大白
博客等级 码龄5年 1万+粉丝 4001原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值