python threading lock_python threading之死锁和可重入锁
一、死锁
简单来说,死锁是一个资源被多次调用,而多次调用方都未能释放该资源就会造成死锁,这里结合例子说明下两种常见的死锁情况。
1、迭代死锁
该情况是一个线程“迭代”请求同一个资源,直接就会造成死锁:
import threading
import time
class MyThread(threading.Thread):
def run(self):
global num
time.sleep(1)
if mutex.acquire(1):
num = num+1
msg = self.name+' set num to '+str(num)
print msg
mutex.acquire()
mutex.release()
mutex.release()
num = 0
mutex = threading.Lock()
def test():
for i in range(5):
t = MyThread()
t.start()
if __name__ == '__main__':
test()
上例中,在run函数的if判断中第一次请求资源,请求后还未 release ,再次acquire,最终无法释放,造成死锁。这里例子中通过将print下面的两行注释掉就可以正常执行了 ,除此之外也可以通过可重入锁解决,后面会提到。
2、互相调用死锁
上例中的死锁是在同一个def函数内多次调用造成的,另一种情况是两个函数中都会调用相同的资源,互相等待对方结束的情况。如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。
import threading
import time
class MyThread(threading.Thread):
def do1(self):
global resA, resB
if mutexA.acquire():
msg = self.name+' got resA'
print msg
if mutexB.acquire(1):
msg = self.name+' got resB'
print msg
mutexB.release()
mutexA.release()
def do2(self):
global resA, resB
if mutexB.acquire():
msg = self.name+' got resB'
print msg
if mutexA.acquire(1):
msg = self.name+' got resA'
print msg
mutexA.release()
mutexB.release()
def run(self):
self.do1()
self.do2()
resA = 0
resB = 0
mutexA = threading.Lock()
mutexB = threading.Lock()
def test():
for i in range(5):
t = MyThread()
t.start()
if __name__ == '__main__':
test()
这个死锁的示例稍微有点复杂。具体可以理下。
二、可重入锁
为了支持在同一线程中多次请求同一资源,python提供了“可重入锁”:threading.RLock。RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。这里以例1为例,如果使用RLock代替Lock,则不会发生死锁:
import threading
import time
class MyThread(threading.Thread):
def run(self):
global num
time.sleep(1)
if mutex.acquire(1):
num = num+1
msg = self.name+' set num to '+str(num)
print msg
mutex.acquire()
mutex.release()
mutex.release()
num = 0
mutex = threading.RLock()
def test():
for i in range(5):
t = MyThread()
t.start()
if __name__ == '__main__':
test()
和例1不同之处在于threading.Lock()换成了threading.RLock() 。
python threading lock_python threading之死锁和可重入锁相关推荐
- python多线程编程(4): 死锁和可重入锁
From: http://www.cnblogs.com/holbrook/archive/2012/03/08/2385449.html 在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并 ...
- java代码如何避免死锁,Java可重入锁如何避免死锁
看到一个问题,Java的可重入锁为什么可以防止死锁呢?网上看了看资料,虽然有答案说出了正确答案,但是分析的不够详细,对初学者不够友好.这里我再做一个更清晰的分析. 首先是示例代码: 1 public ...
- Java中的锁机制 -- 乐观锁、悲观锁、自旋锁、可重入锁、读写锁、公平锁、非公平锁、共享锁、独占锁、重量级锁、轻量级锁、偏向锁、分段锁、互斥锁、同步锁、死锁、锁粗化、锁消除
文章目录 1. Java中的锁机制 1.1 乐观锁 1.2 悲观锁 1.3 自旋锁 1.4 可重入锁(递归锁) 1.5 读写锁 1.6 公平锁 1.7 非公平锁 1.8 共享锁 1.9 独占锁 1.1 ...
- python学习笔记-死锁与递归锁(可重入锁)
本文为了说明例子,用中文作为变量写在了程序里面,一般编程最好不要那么写 本文目录 死锁 递归锁(可重入锁) 代码实现 死锁 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成 ...
- python锁有哪几种_python 可重入锁有什么用?
可重入锁:支持在同一线程中多次请求同一资源 import threading import time class MyThread(threading.Thread): def run(self): ...
- python限制进程数_Python连载36-线程数量限制、Timer、可重入锁
一.允许一个资源最多由几个线程同时进行 命令行:threading.Semaphore(个数) 代表现在最多有几个线程可以进行操作 importthreadingimporttime#参数定义了最多几 ...
- 重入锁、死锁、活锁、公平非公平锁……一下子都给你屡清楚了
目录 写在前面 重入锁 线程饥饿死锁 死锁 活锁(Livelock) 公平锁非公平锁 互斥锁 读-写锁 写在前面 每当听公司大佬提起来,死锁.活锁.公平锁.非公平锁--自己也是知其然而不知其所以然. ...
- java重入锁 自旋锁_java 自旋锁(可重入且无死锁)
java自旋锁 的实现原理:如果自旋锁被另外一个线程对象持有,那么当前获取锁的线程将陷入while循环等待,直到那个持有自旋锁的线程对象释放它所持有的自旋锁,那么那些想要获取该自旋锁的线程对象 将会有 ...
- 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池
并发编程(Concurrent Programming) 进程(Process).线程(Thread).线程的串行 多线程 多线程的原理 多线程的优缺点 Java并发编程 默认线程 开启新线程 `Ru ...
最新文章
- 解析postgresql 删除重复数据案例
- 面试官问一个数据表字段怎么表示多种业务含义?我愣了五分钟
- 普通计算机怎么算根号_大学专业介绍 | 计算机专业的真实就业情况
- Problem A: 删除区间内的元素(线性表)
- python汉字排序规则_Python 中文排序
- a算法和a*算法的区别_机器人路径规划算法,全局路径规划与局部路径规划究竟有哪些区别?...
- OpenGL--天空盒
- 正则表达式中的?表示匹配前面的正则表达式0次或者1次
- 思维导图c语言java区别_C语言基本数据类型的思维导图
- X线、CT、B超、核磁共振区别
- linux防火墙放开pptpd端口号,centos7 安装pptpd(使用iptbales防火墙)
- 2022.7.2新版码易支付源码+三网免签挂+APP监控在线更新
- Tomcat安装及配置详解
- 交易系统开发工程师交易系统开发工程师 - 借此地,招几个人。
- 杭州中学2021高考成绩查询,2020年杭州各高中高考成绩排名及放榜最新消息
- Win10微信查看图片卡顿或发送图片卡顿的原因和解决方法
- 副业案例-晴矢分享 短视频MCN亏损500W的总结的血泪经验
- 四、RNN模型 与 NLP应用 —— Stacked RNN
- 蘑菇导航源码安装教程,wordpress导航主题免费下载[Wordpress主题]
- 面试初体验:经历七场面试大数据开发工程师岗位总结(一)
热门文章
- 你知道Material Type(ROH,HALB,FERT…)为什么缩写是ROH,HALB,FERT吗?哈哈哈
- 在ABAP中将负号提前的方法
- 做好新型冠状病毒防疫 |春节第一重任:说服爸妈带口罩
- 睡眠经济的尽头,会是智能床垫吗?
- linux虚拟化毕业设计,毕业设计(论文)-基于Linux的云校园桌面虚拟化系统的设计与实现(68页)-原创力文档...
- Python三元运算
- Python 基础中20 个小技巧
- Python 读取 csv 文件忽略引号中字段的逗号
- Python基础语法精心总结!看完都知道的可以往下继续学习了
- 一个aov网用邻接矩阵表示_关注讲述我和朱婷7年7个故事,见证一个明星代表的诞生...