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 15 Python
python使用正则表达式提取网页URL的方法
May 26 Python
Python中with及contextlib的用法详解
Jun 08 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
Jul 26 Python
Python3爬虫之urllib携带cookie爬取网页的方法
Dec 28 Python
PyQt5实现类似别踩白块游戏
Jan 24 Python
对python周期性定时器的示例详解
Feb 19 Python
python或C++读取指定文件夹下的所有图片
Aug 31 Python
在python里使用await关键字来等另外一个协程的实例
May 04 Python
详解python使用金山词霸的翻译功能(调试工具断点的使用)
Jan 07 Python
python中编写函数并调用的知识点总结
Jan 13 Python
Python竟然能剪辑视频
May 25 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
PHP4和PHP5共存于一系统
2006/11/17 PHP
新浪微博API开发简介之用户授权(PHP基础篇)
2011/09/25 PHP
教你如何用php实现LOL数据远程获取
2014/06/10 PHP
PHP cURL初始化和执行方法入门级代码
2015/05/28 PHP
Laravel接收前端ajax传来的数据的实例代码
2017/07/20 PHP
解决thinkphp5未定义变量会抛出异常,页面错误,请稍后再试的问题
2019/10/16 PHP
解决PHPstudy Apache无法启动的问题【亲测有效】
2020/10/30 PHP
jquery简单的拖动效果实现原理及示例
2013/07/26 Javascript
使用javascript实现判断当前浏览器
2015/04/14 Javascript
javascript实现简单的html5视频播放器
2015/05/06 Javascript
总结在前端排序中遇到的问题
2016/07/19 Javascript
JavaScript实现简单生成随机颜色的方法
2017/09/21 Javascript
Angular2整合其他插件的方法
2018/01/20 Javascript
Vue $mount实战之实现消息弹窗组件
2019/04/22 Javascript
Vue项目中使用jquery的简单方法
2019/05/16 jQuery
Vue使用NProgress进度条的方法
2019/09/21 Javascript
vue中实现点击按钮滚动到页面对应位置的方法(使用c3平滑属性实现)
2019/12/29 Javascript
Python算法应用实战之队列详解
2017/02/04 Python
Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解
2018/09/04 Python
解决pycharm 误删掉项目文件的处理方法
2018/10/22 Python
python pands实现execl转csv 并修改csv指定列的方法
2018/12/12 Python
Python识别快递条形码及Tesseract-OCR使用详解
2019/07/15 Python
django基于cors解决跨域请求问题详解
2019/08/06 Python
keras 特征图可视化实例(中间层)
2020/01/24 Python
python可迭代对象去重实例
2020/05/15 Python
Python如何实现邮件功能
2020/05/27 Python
美国最顶级的精品店之一:Hampden Clothing
2016/12/22 全球购物
东方通信股份有限公司VC面试题
2014/08/27 面试题
学生党员批评与自我批评
2014/10/15 职场文书
高校教师个人工作总结2014
2014/12/17 职场文书
乡镇科协工作总结2015
2015/05/19 职场文书
大国崛起英国观后感
2015/06/02 职场文书
2015年学校办公室主任工作总结
2015/07/20 职场文书
靠谱准确的求职信
2019/04/02 职场文书
MySQL update set 和 and的区别
2021/05/08 MySQL
MySQL一劳永逸永久支持输入中文的方法实例
2022/08/05 MySQL