Python线程-死锁
2024-09-01 17:24:47
死锁产生的4个必要条件:
1、互斥:一个资源同一时刻只允许一个线程进行访问。
2、占有未释放:一个线程占有资源,且没有释放资源。
3、不可抢占:一个已经占有资源的线程无法抢占到其他线程拥有的资源。
4、循环等待:两个或者两个以上的线程,本身拥有资源,不释放资源,并且同时尝试获得其他线程所持有的资源,这种资源的申请关系形成一个闭环的链条。
死锁的避免:
关于死锁的避免,仁者见仁智者见智。
主要还是从造成死锁的四个条件入手,四个条件不能满足,就不会死锁。
以下是我本人的一些方法:
1.线程等待时(wait)给予一个默认的等待时间
2.线程之间资源避免相互申请对方的资源,可以通过一些容器来控制并发,比如blockqueue,等等一些线程安全的容器
3.尽量避免线程在等待的同时申请资源
4.死锁检测,一个线程在等待一段时间后还没有获得资源就放弃申请。对等待时间进行检测。
一个死锁的例子:
# 线程死锁,在classA和classB相互调用对方的方法,并且相互等待对方释放资源 class ClassA:
def __init__(self):
self.lock=threading.RLock() # 得到classA的锁,试图得到classB的锁
def infoA(self, b):
self.lock.acquire()
time.sleep(10)
b.info()
self.lock.release() def info(self):
self.lock.acquire()
print("this is ClassA info")
self.lock.release() class ClassB:
def __init__(self):
self.lock = threading.RLock() # 得到classB的锁,试图得到classA的锁
def infoB(self, a):
self.lock.acquire()
time.sleep(10)
a.info()
self.lock.release() def info(self):
self.lock.acquire()
print("this is ClassB info")
self.lock.release() ca=ClassA()
cb=ClassB() def funA():
ca.infoA(cb)
def funB():
cb.infoB(ca) # 函数调用不是线程,不会死锁
# funA()
# funB() t1=threading.Thread(target=funA).start()
t2=threading.Thread(target=funB).start()
说明:
线程 | 状态 | |||
classA | 获得classA的锁,sleep(classA的锁未释放) | 申请classB的锁 | 死锁 | |
classB | 获得classB的锁,sleep(classB的锁未释放) | 申请classA的锁 | 死锁 | |
最新文章
- compass Sprites 雪碧图 小图片合成[Sass和compass学习笔记]
- sqoop将关系型的数据库得数据导入到hbase中
- DB_MYSQL_mysql-5.7.10-winx64解压版安装笔记
- spring报nested exception is java.lang.IllegalArgumentException: @EnableAsync annotation metadata was not injected错误
- WIN7启动WIFI
- sql 中英文格式的时间转数字格式
- PLSQL_长脚本如何判断需耗时多久v.sql / v.sqltext / v.sqlarea / v.sql_plan及nohup(案例)
- 改变seekbar的游标图片大小
- CADisplayLink的简单使用
- php示例的错误记录
- Redis in Docker on Linux Container
- Linux将公网ip映射到局域网ip
- syslog-ng日志收集分析服务搭建及配置
- Python中单线程、多线程和多进程的效率对比实验
- Java BAT大型公司面试必考技能视频-1.HashMap源码分析与实现
- http协议基础(六)报文首部
- [C#] 网站程序ASP.NET的性能诊断 - CPU分析
- 机器学习中正则惩罚项L0/L1/L2范数详解
- 初窥Linux之我最常用的20条命令
- jsonrpc.js -- 原生js实现 JSON-RPC 协议
热门文章
- H3C TFTP协议介绍
- jquery银行电子账单表格填入和编辑插件
- Vue的数据双向绑定和Object.defineProperty()
- 微软软件开发技术二十年回顾-.NET框架篇
- 找不到 javax.servlet.http.HttpServletResponse 和 javax.servlet.http.HttpServletRequest 问题解决
- WPF TreeView 展开到指定节点
- Channel 9视频整理【5】
- Python9_类
- 第二阶段:4.商业需求文档MRD:3.PRD-页面结构图
- Alibaba Cloud Toolkit 使用心得(IDEA版)