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实现抓取城市的PM2.5浓度和排名
Mar 19 Python
Python MySQLdb Linux下安装笔记
May 09 Python
Python求两个文本文件以行为单位的交集、并集与差集的方法
Jun 17 Python
Python高级特性与几种函数的讲解
Mar 08 Python
python中metaclass原理与用法详解
Jun 25 Python
简单了解django索引的相关知识
Jul 17 Python
在django-xadmin中APScheduler的启动初始化实例
Nov 15 Python
Pytorch 保存模型生成图片方式
Jan 10 Python
Django全局启用登陆验证login_required的方法
Jun 02 Python
Python私有属性私有方法应用实例解析
Sep 15 Python
Python爬虫UA伪装爬取的实例讲解
Feb 19 Python
Python学习之时间包使用教程详解
Mar 21 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之Smarty入门
2007/01/04 PHP
PHP之变量、常量学习笔记
2008/03/27 PHP
基于php下载文件的详解
2013/06/02 PHP
PHP抽奖算法程序代码分享
2015/10/08 PHP
PHP实现的统计数据功能详解
2016/12/06 PHP
PHP析构函数destruct与垃圾回收机制的讲解
2019/03/22 PHP
让JavaScript拥有类似Lambda表达式编程能力的方法
2010/09/12 Javascript
编写自己的jQuery插件简单实现代码
2011/04/19 Javascript
js中方法重载如何实现?以及函数的参数问题
2013/08/01 Javascript
JS冒泡事件的快速解决方法
2013/12/16 Javascript
jquery基础教程之deferred对象使用方法
2014/01/22 Javascript
jQuery插件cxSelect多级联动下拉菜单实例解析
2016/06/24 Javascript
angular之ng-template模板加载
2017/11/09 Javascript
Nodejs对postgresql基本操作的封装方法
2019/02/20 NodeJs
详解vue.js移动端配置flexible.js及注意事项
2019/04/10 Javascript
js 实现ajax发送步骤过程详解
2019/07/25 Javascript
解决使用layui的时候form表单中的select等不能渲染的问题
2019/09/18 Javascript
JS+DIV实现拖动效果
2020/02/11 Javascript
基于canvas实现手写签名(vue)
2020/05/21 Javascript
JavaScript实现手风琴效果
2021/02/18 Javascript
Python读取网页内容的方法
2015/07/30 Python
python3.5绘制随机漫步图
2018/08/27 Python
基于Python打造账号共享浏览器功能
2019/05/30 Python
Python Web框架之Django框架cookie和session用法分析
2019/08/16 Python
python图的深度优先和广度优先算法实例分析
2019/10/26 Python
pytorch AvgPool2d函数使用详解
2020/01/03 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
2020/06/12 Python
Linux如何修改文件和文件夹的权限
2013/09/05 面试题
旅游与酒店管理的自我评价分享
2013/11/03 职场文书
应届生会计求职信
2013/11/11 职场文书
施工材料员岗位职责
2014/02/12 职场文书
2015年英语教学工作总结
2015/05/25 职场文书
《索溪峪的野》教学反思
2016/02/19 职场文书
初中政治教学反思
2016/02/23 职场文书
node.js如何自定义实现一个EventEmitter
2021/07/16 Javascript
Java Spring 控制反转(IOC)容器详解
2021/10/05 Java/Android