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数据结构树和二叉树简介
Apr 29 Python
Python实现提取文章摘要的方法
Apr 21 Python
python中获得当前目录和上级目录的实现方法
Oct 12 Python
Python排序搜索基本算法之冒泡排序实例分析
Dec 09 Python
python爬虫正则表达式之处理换行符
Jun 08 Python
matplotlib调整子图间距,调整整体空白的方法
Aug 03 Python
如何使用python把ppt转换成pdf
Jun 29 Python
python3 写一个WAV音频文件播放器的代码
Sep 27 Python
python 如何去除字符串头尾的多余符号
Nov 19 Python
Python Django2.0集成Celery4.1教程
Nov 19 Python
python实现替换word中的关键文字(使用通配符)
Feb 13 Python
Python 如何批量更新已安装的库
May 26 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实现parent调用父类的构造方法与被覆写的方法
2015/02/11 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
2018/05/23 PHP
php数组和链表的区别总结
2019/09/20 PHP
csdn 论坛技术区平均给分功能
2009/11/07 Javascript
js中eval()函数和trim()去掉字符串左右空格应用
2013/02/02 Javascript
查找Oracle高消耗语句的方法
2014/03/22 Javascript
淘宝网提供的国内NPM镜像简介和使用方法
2014/04/17 Javascript
自己动手写的javascript前端等待控件
2015/10/30 Javascript
原生js实现百叶窗效果及原理介绍
2016/04/12 Javascript
js自定义select下拉框美化特效
2016/05/12 Javascript
VC调用javascript的几种方法(推荐)
2016/08/09 Javascript
在Docker快速部署Node.js应用的详细步骤
2016/09/02 Javascript
关于微信上网页图片点击全屏放大效果
2016/12/19 Javascript
Javascript 对cookie操作详解及实例
2016/12/29 Javascript
Nodejs之http的表单提交
2017/07/07 NodeJs
vue动态路由配置及路由传参的方式
2018/05/23 Javascript
H5+C3+JS实现双人对战五子棋游戏(UI篇)
2020/05/28 Javascript
使用localStorage替代cookie做本地存储
2019/09/25 Javascript
JavaScript写个贪吃蛇小游戏(超详细)
2020/03/17 Javascript
[03:27]《辉夜杯》线下训练营 导师CU和海涛指点迷津
2015/10/23 DOTA
Python中操作符重载用法分析
2016/04/29 Python
python得到单词模式的示例
2018/10/15 Python
利用python GDAL库读写geotiff格式的遥感影像方法
2018/11/29 Python
Python模块的加载讲解
2019/01/15 Python
Python使用LDAP做用户认证的方法
2019/06/20 Python
Python递归函数 二分查找算法实现解析
2019/08/12 Python
Pytorch实现的手写数字mnist识别功能完整示例
2019/12/13 Python
Python requests模块session代码实例
2020/04/14 Python
Python ADF 单位根检验 如何查看结果的实现
2020/06/03 Python
python关于倒排列的知识点总结
2020/10/13 Python
大学生简历中个人的自我评价
2013/10/06 职场文书
财务管理职业生涯规划书
2014/02/26 职场文书
小学生竞选班干部演讲稿
2014/04/24 职场文书
2014年工程工作总结
2014/11/25 职场文书
学校运动会感想
2015/08/10 职场文书