Python多线程编程(六):可重入锁RLock


Posted in Python onApril 05, 2015

考虑这种情况:如果一个线程遇到锁嵌套的情况该怎么办,这个嵌套是指当我一个线程在获取临界资源时,又需要再次获取。

根据这种情况,代码如下:

''' 

Created on 2012-9-8 

 

@author: walfred 

@module: thread.ThreadTest6 

'''  

 

import threading  

import time  

 

counter = 0  

mutex = threading.Lock()  

 

class MyThread(threading.Thread):  

    def __init__(self):  

        threading.Thread.__init__(self)  

 

    def run(self):  

        global counter, mutex  

        time.sleep(1);  

        if mutex.acquire():  

            counter += 1  

            print "I am %s, set counter:%s" % (self.name, counter)  

            if mutex.acquire():  

                counter += 1  

                print "I am %s, set counter:%s" % (self.name, counter)  

                mutex.release()  

            mutex.release()  

 

if __name__ == "__main__":  

    for i in range(0, 200):  

        my_thread = MyThread()  

        my_thread.start()

这种情况的代码运行情况如下:

I am Thread-1, set counter:1

之后就直接挂起了,这种情况形成了最简单的死锁。

那有没有一种情况可以在某一个线程使用互斥锁访问某一个竞争资源时,可以再次获取呢?在Python中为了支持在同一线程中多次请求同一资源,python提供了“可重入锁”:threading.RLock。这个RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。上面的例子如果使用RLock代替Lock,则不会发生死锁:

代码只需将上述的:

mutex = threading.Lock()

替换成:
mutex = threading.RLock()

即可。
Python 相关文章推荐
Python中字典映射类型的学习教程
Aug 20 Python
总结网络IO模型与select模型的Python实例讲解
Jun 27 Python
Python数据分析之真实IP请求Pandas详解
Nov 18 Python
python中找出numpy array数组的最值及其索引方法
Apr 17 Python
使用python验证代理ip是否可用的实现方法
Jul 25 Python
Python面向对象程序设计示例小结
Jan 30 Python
python爬取内容存入Excel实例
Feb 20 Python
浅谈Python 敏感词过滤的实现
Aug 15 Python
Python3 集合set入门基础
Feb 10 Python
Python实时监控网站浏览记录实现过程详解
Jul 14 Python
Python利用pip安装tar.gz格式的离线资源包
Sep 14 Python
Python pip 常用命令汇总
Oct 19 Python
Python多线程编程(五):死锁的形成
Apr 05 #Python
Python多线程编程(四):使用Lock互斥锁
Apr 05 #Python
Python多线程编程(三):threading.Thread类的重要函数和方法
Apr 05 #Python
Python多线程编程(二):启动线程的两种方法
Apr 05 #Python
Python多线程编程(一):threading模块综述
Apr 05 #Python
Python中使用dom模块生成XML文件示例
Apr 05 #Python
Python中比较特别的除法运算和幂运算介绍
Apr 05 #Python
You might like
php中实现记住密码自动登录的代码
2011/03/02 PHP
慎用preg_replace危险的/e修饰符(一句话后门常用)
2013/06/19 PHP
Yii2实现上下联动下拉框功能的方法
2016/08/10 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
ThinkPHP框架表单验证操作方法
2017/07/19 PHP
PHP实现防止表单重复提交功能【基于token验证】
2018/05/24 PHP
PHP PDOStatement::bindValue讲解
2019/01/30 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
ie8本地图片上传预览示例代码
2014/01/12 Javascript
Bootstrap前端开发案例一
2016/06/17 Javascript
javascript类型系统_正则表达式RegExp类型详解
2016/06/24 Javascript
相册展示PhotoSwipe.js插件实现
2016/08/25 Javascript
js实现canvas图片与img图片的相互转换的示例
2017/08/31 Javascript
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
vue-router命名路由和编程式路由传参讲解
2019/01/19 Javascript
jQuery动态生成的元素绑定事件操作实例分析
2019/05/04 jQuery
js简单实现自动生成表格功能示例
2020/06/02 Javascript
vue中el-input绑定键盘按键(按键修饰符)
2020/07/22 Javascript
vue element el-transfer增加拖拽功能
2021/01/15 Vue.js
Python中还原JavaScript的escape函数编码后字符串的方法
2014/08/22 Python
详解Python中类的定义与使用
2017/04/11 Python
详解python 拆包可迭代数据如tuple, list
2017/12/29 Python
PYTHON基础-时间日期处理小结
2018/05/05 Python
Linux系统(CentOS)下python2.7.10安装
2018/09/26 Python
Python:二维列表下标互换方式(矩阵转置)
2019/12/02 Python
弄清Pytorch显存的分配机制
2020/12/10 Python
CSS3支持IE6, 7, and 8的边框border属性
2012/12/28 HTML / CSS
html5中valid、invalid、required的定义
2014/02/21 HTML / CSS
美国最大的宠物用品零售商:PetSmart
2016/11/14 全球购物
.NET面试10题
2014/02/24 面试题
机械电子工程专业推荐信范文
2013/11/20 职场文书
学校读书活动总结
2014/06/30 职场文书
街道务虚会发言材料
2014/10/20 职场文书
Nginx 过滤静态资源文件的访问日志的实现
2021/03/31 Servers
MySQL如何构建数据表索引
2021/05/13 MySQL
Python Pandas读取Excel日期数据的异常处理方法
2022/02/28 Python