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代码
Mar 13 Python
Python常见文件操作的函数示例代码
Nov 15 Python
Python多线程同步Lock、RLock、Semaphore、Event实例
Nov 21 Python
python登录豆瓣并发帖的方法
Jul 08 Python
python学习笔记之调用eval函数出现invalid syntax错误问题
Oct 18 Python
python实现应用程序在右键菜单中添加打开方式功能
Jan 09 Python
python+matplotlib实现礼盒柱状图实例代码
Jan 16 Python
Python实现将通信达.day文件读取为DataFrame
Dec 22 Python
python利用JMeter测试Tornado的多线程
Jan 12 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
Feb 04 Python
python 成功引入包但无法正常调用的解决
Mar 09 Python
python 闭包函数详细介绍
Apr 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无限极分类实现的两种解决方法
2013/04/28 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
2015/12/25 PHP
PHP获取指定日期是星期几的实现方法
2016/11/30 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
脚本吧 - 幻宇工作室用到js,超强推荐base.js
2006/12/23 Javascript
JavaScript的目的分析
2007/01/05 Javascript
利用jQuery接受和处理xml数据的代码(.net)
2011/03/28 Javascript
js限制文本框输入长度两种限制方式(长度、字节数)
2012/12/19 Javascript
node.js学习总结之调式代码的方法
2014/06/25 Javascript
Jquery promise实现一张一张加载图片
2015/11/13 Javascript
jquery实现简单的遮罩层
2016/01/08 Javascript
理解javascript正则表达式
2016/03/08 Javascript
js实现select二级联动下拉菜单
2020/04/17 Javascript
基于Vue.js实现数字拼图游戏
2016/08/02 Javascript
什么是JavaScript注入攻击?
2016/09/14 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
2017/08/17 Javascript
详解React native全局变量的使用(跨组件的通信)
2017/09/07 Javascript
详解React Native顶|底部导航使用小技巧
2017/09/14 Javascript
Node.js实现发送邮件功能
2017/11/06 Javascript
ajax请求+vue.js渲染+页面加载的示例
2018/02/11 Javascript
利用JavaScript缓存远程窃取Wi-Fi密码的思路详解
2018/11/05 Javascript
Vue的编码技巧与规范使用详解
2019/08/28 Javascript
Layui表格行工具事件与数据回填方法
2019/09/13 Javascript
Vue 2.0双向绑定原理的实现方法
2019/10/23 Javascript
vue keep-alive的简单总结
2021/01/25 Vue.js
Python实现的使用telnet登陆聊天室实例
2015/06/17 Python
Python输出汉字字库及将文字转换为图片的方法
2016/06/04 Python
Pandas操作CSV文件的读写实现方法
2019/11/13 Python
使用pyinstaller逆向.pyc文件
2019/12/20 Python
编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串
2014/01/07 面试题
师范生实习自我鉴定
2013/11/01 职场文书
行政文秘岗位职责范本
2014/02/10 职场文书
扩大国家免疫规划实施方案
2014/03/21 职场文书
无锡灵山大佛导游词
2015/02/09 职场文书
部门主管竞聘书
2015/09/15 职场文书