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实现web端用户登录和注册功能的教程
Apr 30 Python
python计算方程式根的方法
May 07 Python
python实现矩阵乘法的方法
Jun 28 Python
TF-IDF算法解析与Python实现方法详解
Nov 16 Python
通过Pandas读取大文件的实例
Jun 07 Python
python脚本实现验证码识别
Jun 07 Python
python实现求特征选择的信息增益
Dec 18 Python
python定时检测无响应进程并重启的实例代码
Apr 22 Python
Python计算两个矩形重合面积代码实例
Sep 16 Python
浅析python 定时拆分备份 nginx 日志的方法
Apr 27 Python
Python经纬度坐标转换为距离及角度的实现
Nov 01 Python
Python趣味挑战之实现简易版音乐播放器
May 28 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 session文件独占锁引起阻塞问题解决方法
2015/05/12 PHP
前台js改变Session的值(用ajax实现)
2012/12/28 Javascript
jsPDF生成pdf后在网页展示实例
2014/01/16 Javascript
js判断上传文件类型判断FileUpload文件类型代码
2014/05/20 Javascript
js验证身份证号有效性并提示对应信息
2015/10/19 Javascript
浅析JavaScript Array和string的转换(推荐)
2016/05/20 Javascript
jquery获取form表单input元素值的简单实例
2016/05/30 Javascript
浅谈window.onbeforeunload() 事件调用ajax
2016/06/29 Javascript
快速解决js开发下拉框中blur与click冲突
2016/10/10 Javascript
D3.js封装文本实现自动换行和旋转平移等功能
2016/10/14 Javascript
js使用i18n实现页面国际化的方法
2017/05/09 Javascript
如何将你的AngularJS1.x应用迁移至React的方法
2018/02/01 Javascript
详解js跨域请求的两种方式,支持post请求
2018/05/05 Javascript
JavaScript设计模式之装饰者模式定义与应用示例
2018/07/25 Javascript
详解@angular/cli 改变默认启动端口两种方式
2018/11/29 Javascript
JavaScript中构造函数与原型链之间的关系详解
2019/02/25 Javascript
vue+php实现的微博留言功能示例
2019/03/16 Javascript
基于javascript实现日历功能原理及代码实例
2020/05/07 Javascript
详解Howler.js Web音频播放终极解决方案
2020/08/23 Javascript
基于原生JS封装的Modal对话框插件的示例代码
2020/09/09 Javascript
Python的ORM框架SQLAlchemy入门教程
2014/04/28 Python
Python实现新浪博客备份的方法
2016/04/27 Python
使用PM2+nginx部署python项目的方法示例
2018/11/07 Python
Django渲染Markdown文章目录的方法示例
2019/01/02 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
2019/04/01 Python
python实现列表中最大最小值输出的示例
2019/07/09 Python
pandas dataframe 中的explode函数用法详解
2020/05/18 Python
python爬虫筛选工作实例讲解
2020/11/23 Python
使用CSS3实现字体颜色渐变的实现
2020/08/10 HTML / CSS
师生聚会感言
2014/01/26 职场文书
机电一体化求职信
2014/03/10 职场文书
商超业务员岗位职责
2014/03/12 职场文书
大学生个人学习总结
2015/02/15 职场文书
委托书范本格式
2019/04/18 职场文书
Django项目如何获得SSL证书与配置HTTPS
2021/04/30 Python
Vue的生命周期一起来看看
2022/02/24 Vue.js