位置: 编程技术 - 正文

Python中死锁的形成示例及死锁情况的防止(代码实现死锁)

编辑:rootadmin

推荐整理分享Python中死锁的形成示例及死锁情况的防止(代码实现死锁),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:代码实现死锁,pythongil锁,python threadpoolexecutor 锁,python锁有哪几种,python锁有哪几种,python锁有哪几种,python 锁,python中lock锁和阻塞,内容如对您有帮助,希望把文章链接给更多的朋友!

死锁示例搞多线程的经常会遇到死锁的问题,学习操作系统的时候会讲到死锁相关的东西,我们用Python直观的演示一下。死锁的一个原因是互斥锁。假设银行系统中,用户a试图转账块给用户b,与此同时用户b试图转账块给用户a,则可能产生死锁。2个线程互相等待对方的锁,互相占用着资源不释放。

防止死锁的加锁机制问题:你正在写一个多线程程序,其中线程需要一次获取多个锁,此时如何避免死锁问题。解决方案:在多线程程序中,死锁问题很大一部分是由于线程同时获取多个锁造成的。举个例子:一个线程获取了第一个锁,然后在获取第二个锁的 时候发生阻塞,那么这个线程就可能阻塞其他线程的执行,从而导致整个程序假死。 解决死锁问题的一种方案是为程序中的每一个锁分配一个唯一的id,然后只允许按照升序规则来使用多个锁,这个规则使用上下文管理器 是非常容易实现的,示例如下:

如何使用这个上下文管理器呢?你可以按照正常途径创建一个锁对象,但不论是单个锁还是多个锁中都使用 acquire() 函数来申请锁, 示例如下:

如果你执行这段代码,你会发现它即使在不同的函数中以不同的顺序获取锁也没有发生死锁。 其关键在于,在第一段代码中,我们对这些锁进行了排序。通过排序,使得不管用户以什么样的顺序来请求锁,这些锁都会按照固定的顺序被获取。 如果有多个 acquire() 操作被嵌套调用,可以通过线程本地存储(TLS)来检测潜在的死锁问题。 假设你的代码是这样写的:

如果你运行这个版本的代码,必定会有一个线程发生崩溃,异常信息可能像这样:

Python中死锁的形成示例及死锁情况的防止(代码实现死锁)

发生崩溃的原因在于,每个线程都记录着自己已经获取到的锁。 acquire() 函数会检查之前已经获取的锁列表, 由于锁是按照升序排列获取的,所以函数会认为之前已获取的锁的id必定小于新申请到的锁,这时就会触发异常。

讨论死锁是每一个多线程程序都会面临的一个问题(就像它是每一本操作系统课本的共同话题一样)。根据经验来讲,尽可能保证每一个 线程只能同时保持一个锁,这样程序就不会被死锁问题所困扰。一旦有线程同时申请多个锁,一切就不可预料了。

死锁的检测与恢复是一个几乎没有优雅的解决方案的扩展话题。一个比较常用的死锁检测与恢复的方案是引入看门狗计数器。当线程正常 运行的时候会每隔一段时间重置计数器,在没有发生死锁的情况下,一切都正常进行。一旦发生死锁,由于无法重置计数器导致定时器 超时,这时程序会通过重启自身恢复到正常状态。

避免死锁是另外一种解决死锁问题的方式,在进程获取锁的时候会严格按照对象id升序排列获取,经过数学证明,这样保证程序不会进入 死锁状态。证明就留给读者作为练习了。避免死锁的主要思想是,单纯地按照对象id递增的顺序加锁不会产生循环依赖,而循环依赖是 死锁的一个必要条件,从而避免程序进入死锁状态。

下面以一个关于线程死锁的经典问题:“哲学家就餐问题”,作为本节最后一个例子。题目是这样的:五位哲学家围坐在一张桌子前,每个人 面前有一碗饭和一只筷子。在这里每个哲学家可以看做是一个独立的线程,而每只筷子可以看做是一个锁。每个哲学家可以处在静坐、 思考、吃饭三种状态中的一个。需要注意的是,每个哲学家吃饭是需要两只筷子的,这样问题就来了:如果每个哲学家都拿起自己左边的筷子, 那么他们五个都只能拿着一只筷子坐在那儿,直到饿死。此时他们就进入了死锁状态。 下面是一个简单的使用死锁避免机制解决“哲学家就餐问题”的实现:

最后,要特别注意到,为了避免死锁,所有的加锁操作必须使用 acquire() 函数。如果代码中的某部分绕过acquire 函数直接申请锁,那么整个死锁避免机制就不起作用了。

浅谈python新手中常见的疑惑及解答 1lambda函数函数格式是lambdakeys:express匿名函数lambda是一个表达式函数,接受keys参数,返回表达式的值。所以不用return,也没有函数名,经常用在需要key参

Python实现TCP协议下的端口映射功能的脚本程序示例 1端口映射举个例子来说明一下端口映射的作用。有A、B、C三台计算机,A、B互通,B、C互通,但是A、C不通,这个时候在C上开了一个Web服务,如何让A访

Python实现TCP/IP协议下的端口转发及重定向示例 首先,我们用webpy写一个简单的网站,监听端口,返回Hello,EverET.org的页面。然后我们使用我们的forwarding.py,在端口和端口中间建立两条通信管道

标签: 代码实现死锁

本文链接地址:https://www.jiuchutong.com/biancheng/387636.html 转载请保留说明!

上一篇:Python使用dis模块把Python反编译为字节码的用法详解

下一篇:浅谈python新手中常见的疑惑及解答(python入坑指南)

  • 公司食堂辅助账怎么记账
  • 什么是印花税的税目
  • 土地增值税预缴税率
  • 税收优惠退税会计处理
  • 没有社保可以缴费吗
  • 进口设备消费税税率是多少
  • 房产代理经纪人
  • 原材料的合理损耗
  • 建筑装饰行业会计分录
  • 一般纳税人制作除尘器的制作费开票税率是多少
  • 个人独资企业是法人吗
  • 资产负债表是累计记账吗
  • 小规模税务30万免税政策
  • 超市预付卡发票如何入账
  • 其他应收款借方和贷方什么意思
  • 房屋出租何时缴纳房产税?
  • 材料的盘点包括
  • 城镇土地使用税征收标准及计算方法
  • mac打不开网页但是可以上微信
  • 没进项能开销项吗
  • 债权转增资本公积账务处理
  • 完税凭证遗失后怎么处理
  • 企业注销时还有应付职工薪酬怎么办
  • leeurbanriders是什么牌子
  • php变量底层实现
  • 一个完整的php文件有哪些元素组成
  • 车间耗材管理办法
  • 公司承担责任的方式
  • echart设置legend
  • php表单提交输入判断
  • 跨年度退货的账务处理
  • 小满内容
  • alex研究原文
  • 记一次调试YOLOv5+DeepSort车辆跟踪项目的经过
  • React Hook - useState函数的详细解析
  • 利润表上期数指的是什么
  • 资产处置费用是资产类会计科目吗
  • 织梦cms要钱吗
  • 认证后失控发票管理办法
  • 增值税发票的认证
  • 小规模纳税人起征点变化历程
  • 主营业务税金及附加和税金及附加的区别
  • SQL Server 2005/2008 导入导出数据常见报错解决方法
  • mongodb 设置用户名密码
  • 个人抬头的发票可以入账吗
  • 印花税的征收方式有哪些
  • 生育津贴是怎么申请
  • 企业利息收入需要缴纳所得税吗
  • 实收资本期末需要结转吗
  • 以前年度损益调整是什么意思
  • 房地产项目完工清算报告
  • 专利权摊销如何计算
  • 公司注销时应付账款怎么处理
  • 出口退税暂不抵税怎么办
  • 废料收入是什么会计分录
  • 企业买房怎么入账
  • 公司车子折旧相差多少
  • 股权投资与债权投资包括什么
  • 小规模纳税人公户转私户可以吗
  • window正在检查内存
  • 安装抖音
  • freebsd查看硬盘信息
  • solaris x86软件 sparc 区别
  • DxDebugService.exe是什么进程 DxDebugService进程安全吗
  • 关于linux操作系统的描述中
  • windows8怎么新建word文档
  • windows 10为什么不能关掉自动更新
  • js获取数组元素个数
  • Zxing在CameraManager.get().closeDriver()报错
  • androidstudio 教程
  • android界面控件
  • python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
  • python如何做网站
  • jQuery使用animate实现ul列表项相互飘动效果示例
  • javascript教程完整版
  • js创建一个对象,里面有属性和方法
  • 广西地税局局长
  • 深圳如何打印个人征信
  • 失业保险金领取成功
  • 多缴税款可以抵顶以后欠费的税款吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设