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 文件操作实现代码
Oct 07 Python
人机交互程序 python实现人机对话
Nov 14 Python
简述Python2与Python3的不同点
Jan 21 Python
Python tkinter事件高级用法实例
Jan 31 Python
tensorflow训练中出现nan问题的解决
Feb 10 Python
Django如何简单快速实现PUT、DELETE方法
Jul 24 Python
python写程序统计词频的方法
Jul 29 Python
pytorch 实现删除tensor中的指定行列
Jan 13 Python
pycharm实现猜数游戏
Dec 07 Python
基于python定位棋子位置及识别棋子颜色
Jul 26 Python
Pillow图像处理库安装及使用
Apr 12 Python
Python用any()函数检查字符串中的字母以及如何使用all()函数
Apr 14 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 使用post,get的一种简洁方式
2010/04/25 PHP
zend framework多模块多布局配置
2011/02/26 PHP
PHP中去掉字符串首尾空格的方法
2012/05/19 PHP
php缩放图片(根据宽高的等比例缩放)实例介绍
2013/06/09 PHP
php使用fsockopen函数发送post,get请求获取网页内容的方法
2014/11/15 PHP
php类自动加载器实现方法
2015/07/28 PHP
PHP加密解密类实例代码
2016/07/20 PHP
PHP手机号码及邮箱正则表达式实例解析
2020/07/11 PHP
JavaScript 提升运行速度之循环篇 译文
2009/08/15 Javascript
WEB页子窗口(showModalDialog和showModelessDialog)使用说明
2009/10/25 Javascript
JavaScript学习笔记(一) js基本语法
2011/10/25 Javascript
使用Jquery Aajx访问WCF服务(GET、POST、PUT、DELETE)
2012/03/16 Javascript
通过jQuery源码学习javascript(二)
2012/12/27 Javascript
JavaScript的Module模式编程深入分析
2013/08/13 Javascript
引入JS文件IE6报语法错误或缺少对象问题的解决方法
2014/01/09 Javascript
JavaScript初学者建议:不要去管浏览器兼容
2014/02/04 Javascript
基于jquery实现表格内容筛选功能实例解析
2016/05/09 Javascript
vue2.X组件学习心得(新手必看篇)
2017/07/05 Javascript
JS实现根据指定值删除数组中的元素操作示例
2018/08/02 Javascript
深入理解JS中Number(),parseInt(),parseFloat()三者比较
2018/08/24 Javascript
浅谈python对象数据的读写权限
2016/09/12 Python
python 截取 取出一部分的字符串方法
2017/03/01 Python
Python基于回溯法子集树模板实现8皇后问题
2017/09/01 Python
如何用Python来搭建一个简单的推荐系统
2019/08/07 Python
pandas 对group进行聚合的例子
2019/12/27 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
2020/06/09 Python
后勤人员自我评价怎么写
2013/09/19 职场文书
店长助理岗位职责
2013/12/13 职场文书
求职简历的自我评价
2014/01/31 职场文书
给老师的一封建议书
2014/03/13 职场文书
幼儿园课题实施方案
2014/05/14 职场文书
社区个人对照检查材料(群众路线)
2014/09/26 职场文书
2016学习全国教书育人楷模先进事迹心得体会
2016/01/21 职场文书
《雪地里的小画家》教学反思
2016/02/16 职场文书
2016年学校“3.12”植树节活动总结
2016/03/16 职场文书
sql字段解析器的实现示例
2021/06/23 SQL Server