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的id()函数解密过程
Dec 25 Python
pyqt4教程之widget使用示例分享
Mar 07 Python
在Python中操作字典之clear()方法的使用
May 21 Python
Python实现压缩文件夹与解压缩zip文件的方法
Sep 01 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
Apr 15 Python
Python实现字符型图片验证码识别完整过程详解
May 10 Python
python 使用pdfminer3k 读取PDF文档的例子
Aug 27 Python
Python求平面内点到直线距离的实现
Jan 19 Python
Python @property原理解析和用法实例
Feb 11 Python
python实现扫雷游戏
Mar 03 Python
基于SpringBoot构造器注入循环依赖及解决方式
Apr 26 Python
详解MindSpore自定义模型损失函数
Jun 30 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依赖注入和控制反转
2016/05/11 PHP
CL vs ForZe BO5 第一场 2.13
2021/03/10 DOTA
table对象中的insertRow与deleteRow使用示例
2014/01/26 Javascript
调试代码导致IE出错的避免方法
2014/04/04 Javascript
javascript使用for循环批量注册的事件不能正确获取索引值的解决方法
2014/12/20 Javascript
javascript中定义类的方法详解
2015/02/10 Javascript
JavaScript实现仿淘宝商品购买数量的增减效果
2016/01/22 Javascript
jQuery简单实现上下,左右滑动的方法
2016/06/01 Javascript
jQuery基于ajax操作json数据简单示例
2017/01/05 Javascript
JS图片压缩(pc端和移动端都适用)
2017/01/12 Javascript
jQuery动态产生select option下拉列表
2017/03/15 Javascript
vue使用Axios做ajax请求详解
2017/06/07 Javascript
js案例之鼠标跟随jquery版(实例讲解)
2017/07/21 jQuery
vue如何集成raphael.js中国地图的方法示例
2017/08/15 Javascript
基于js 本地存储(详解)
2017/08/16 Javascript
微信小程序动态增加按钮组件
2018/09/14 Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
2019/02/28 Javascript
React中阻止事件冒泡的问题详析
2019/04/12 Javascript
解决layer图标icon不加载的问题
2019/09/04 Javascript
[13:25]VP vs VICI (BO3)
2018/06/07 DOTA
python使用锁访问共享变量实例解析
2018/02/08 Python
python opencv 图像拼接的实现方法
2019/06/27 Python
新建文件时Pycharm中自动设置头部模板信息的方法
2020/04/17 Python
Python之变量类型和if判断方式
2020/05/05 Python
Gap中国官网:美式休闲风服饰
2017/02/05 全球购物
蒙蒂塞罗商店:Monticello Shop
2018/11/25 全球购物
Linux管理员面试题 Linux admin interview questions
2014/11/01 面试题
机电一体化职业规划书
2014/01/07 职场文书
党性教育心得体会
2014/09/03 职场文书
新兵入伍心得体会
2014/09/04 职场文书
初中家长评语大全
2014/12/26 职场文书
2015年教学管理工作总结
2015/05/20 职场文书
2015年汽车销售员工作总结
2015/07/24 职场文书
jquery插件实现代码雨特效
2021/04/24 jQuery
springboot如何初始化执行sql语句
2021/06/22 Java/Android
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电