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 31 Python
详解python之多进程和进程池(Processing库)
Jun 09 Python
Python实现二维数组输出为图片
Apr 03 Python
opencv python 图像去噪的实现方法
Aug 31 Python
django的settings中设置中文支持的实现
Apr 28 Python
python使用pygame模块实现坦克大战游戏
Mar 25 Python
如何基于python操作json文件获取内容
Dec 24 Python
tensorflow指定GPU与动态分配GPU memory设置
Feb 03 Python
pyqt5数据库使用详细教程(打包解决方案)
Mar 25 Python
PyCharm 在Windows的有用快捷键详解
Apr 07 Python
Python json读写方式和字典相互转化
Apr 18 Python
C3 线性化算法与 MRO之Python中的多继承
Oct 05 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程序--记数器
2006/10/09 PHP
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
2012/04/09 PHP
yii分页组件用法实例分析
2015/12/28 PHP
Symfony核心类概述
2016/03/17 PHP
php+ajax登录跳转登录实现思路
2016/07/31 PHP
php简单截取字符串代码示例
2016/10/19 PHP
PHP获取HTTP body内容的方法
2018/12/31 PHP
PDO::query讲解
2019/01/29 PHP
php源码的安装方法和实例
2019/09/26 PHP
动态获取复选框checkbox选中个数的jquery代码
2013/06/25 Javascript
判断及设置浏览器全屏模式
2014/04/20 Javascript
jquery库文件略庞大用纯js替换jquery的方法
2014/08/12 Javascript
解决vue-quill-editor上传内容由于图片是base64的导致字符太长的问题
2018/08/20 Javascript
vue实现分页栏效果
2019/06/28 Javascript
[02:23]2018DOTA2亚洲邀请赛趣味视频——反应测试
2018/04/04 DOTA
Python中的zip函数使用示例
2015/01/29 Python
Python中利用原始套接字进行网络编程的示例
2015/05/04 Python
Python实现桶排序与快速排序算法结合应用示例
2017/11/22 Python
Python爬虫的两套解析方法和四种爬虫实现过程
2018/07/20 Python
Tensorflow分类器项目自定义数据读入的实现
2019/02/05 Python
python使用百度文字识别功能方法详解
2019/07/23 Python
python中的反斜杠问题深入讲解
2019/08/12 Python
通过celery异步处理一个查询任务的完整代码
2019/11/19 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
2020/07/03 Python
悬挂训练绳:TRX
2017/12/14 全球购物
Myprotein瑞典官方网站:畅销欧洲英国运动营养品牌
2018/01/22 全球购物
Java Servlet API中forward() 与redirect()的区别
2014/04/20 面试题
机械系毕业生求职信
2014/05/28 职场文书
工地门卫岗位职责范本
2014/07/01 职场文书
2014年乡镇人大工作总结
2014/11/25 职场文书
个人委托书范文
2015/01/28 职场文书
收入证明怎么写
2015/06/12 职场文书
优质服务心得体会(共4篇)
2016/01/22 职场文书
详解MySQL的主键查询为什么这么快
2022/04/03 MySQL
Android Flutter实现3D动画效果示例详解
2022/04/07 Java/Android
基于Python编写一个监控CPU的应用系统
2022/06/25 Python