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之不要红头文件(1)
Sep 28 Python
Python编程实现的图片识别功能示例
Aug 03 Python
Python网络编程详解
Oct 31 Python
在Pycharm中将pyinstaller加入External Tools的方法
Jan 16 Python
Python实现蒙特卡洛算法小实验过程详解
Jul 12 Python
django2笔记之路由path语法的实现
Jul 17 Python
python内存监控工具memory_profiler和guppy的用法详解
Jul 29 Python
python基于json文件实现的gearman任务自动重启代码实例
Aug 13 Python
Python定义函数时参数有默认值问题解决
Dec 19 Python
Python任务自动化工具tox使用教程
Mar 17 Python
Python爬虫实战案例之爬取喜马拉雅音频数据详解
Dec 07 Python
matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel())
Feb 22 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
最省空间的计数器
2006/10/09 PHP
PHP实现异步调用方法研究与分享
2011/10/27 PHP
php预定义变量使用帮助(带实例)
2013/10/30 PHP
php实现图片添加水印功能
2014/02/13 PHP
php新浪微博登录接口用法实例
2014/12/23 PHP
PHP使用SMTP邮件服务器发送邮件示例
2018/08/28 PHP
php设计模式之职责链模式定义与用法经典示例
2019/09/19 PHP
JavaScript 学习小结(适合新手参考)
2009/07/30 Javascript
jquery 读取页面load get post ajax 四种方式代码写法
2011/04/02 Javascript
jquery获取table中的某行全部td的内容方法
2013/03/08 Javascript
解析js中获得父窗口链接getParent方法以及各种打开窗口的方法
2013/06/19 Javascript
jquery入门必备的基本认识及实例(整理)
2013/06/24 Javascript
js获取下拉列表框中的value和text的值示例代码
2014/01/11 Javascript
jQuery中on()方法用法实例
2015/01/19 Javascript
在Python中使用glob模块查找文件路径的方法
2015/06/17 Javascript
iPhone手机上搭建nodejs服务器步骤方法
2015/07/06 NodeJs
轻松学习jQuery插件EasyUI EasyUI实现树形网络基本操作(2)
2015/11/30 Javascript
jQuery实现input[type=file]多图预览上传删除等功能
2019/08/02 jQuery
JSX在render函数中的应用详解
2019/09/04 Javascript
Python 连连看连接算法
2008/11/22 Python
python获取局域网占带宽最大3个ip的方法
2015/07/09 Python
socket + select 完成伪并发操作的实例
2017/08/15 Python
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
2017/11/08 Python
python re正则匹配网页中图片url地址的方法
2018/12/20 Python
在python中实现求输出1-3+5-7+9-......101的和
2020/04/02 Python
英国领先的瓷砖专家:Walls and Floors
2018/04/27 全球购物
Collection和Collections的区别
2016/05/02 面试题
机械专业个人求职自荐信格式
2013/09/21 职场文书
中文专业毕业生自荐书范文
2014/01/04 职场文书
教师党员整改措施
2014/10/24 职场文书
前台接待岗位职责范本
2015/04/03 职场文书
队列队形口号
2015/12/25 职场文书
QT与javascript交互数据的实现
2021/05/26 Javascript
开机音效回归! Windows 11重新引入开机铃声
2021/11/21 数码科技
Pandas搭配lambda组合使用详解
2022/01/22 Python
HTML CSS 一个标签实现带动画的抖音LOGO
2022/04/26 HTML / CSS