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 24 Python
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
Sep 26 Python
python如何通过实例方法名字调用方法
Mar 21 Python
python3将视频流保存为本地视频文件
Jun 20 Python
pygame游戏之旅 添加碰撞效果的方法
Nov 20 Python
PYQT5实现控制台显示功能的方法
Jun 25 Python
Python Django框架防御CSRF攻击的方法分析
Oct 18 Python
DataFrame 数据合并实现(merge,join,concat)
Jun 14 Python
Pyinstaller打包Scrapy项目的实现步骤
Sep 22 Python
Python tempfile模块生成临时文件和临时目录
Sep 30 Python
matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
Jan 05 Python
Django项目如何获得SSL证书与配置HTTPS
Apr 30 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
mysql总结之explain
2012/02/27 PHP
PHP file_exists问题杂谈
2012/05/07 PHP
php读取EXCEL文件 php excelreader读取excel文件
2012/12/06 PHP
php获取中文拼音首字母类和函数分享
2014/04/24 PHP
javascript编程起步(第五课)
2007/01/10 Javascript
33种Javascript 表格排序控件收集
2009/12/03 Javascript
用Jquery实现滚动新闻
2014/02/12 Javascript
基于JS如何实现给字符加千分符(65,541,694,158)
2016/08/03 Javascript
js自制图片放大镜功能
2017/01/24 Javascript
BootStrap表单宽度设置方法
2017/03/10 Javascript
微信小程序-横向滑动scroll-view隐藏滚动条
2017/04/20 Javascript
Angular 作用域scope的具体使用
2017/12/11 Javascript
JS+HTML实现的圆形可点击区域示例【3种方法】
2018/08/01 Javascript
react组件从搭建脚手架到在npm发布的步骤实现
2019/01/09 Javascript
JS开发 富文本编辑器TinyMCE详解
2019/07/19 Javascript
layer.open 子页面弹出层向父页面传输数据的例子
2019/09/26 Javascript
vue 手机物理监听键+退出提示代码
2020/09/09 Javascript
linux系统使用python获取内存使用信息脚本分享
2014/01/15 Python
使用C++扩展Python的功能详解
2018/01/12 Python
破解安装Pycharm的方法
2018/10/19 Python
Python实现去除图片中指定颜色的像素功能示例
2019/04/13 Python
打包python 加icon 去掉cmd黑窗口方法
2019/06/24 Python
python爬虫添加请求头代码实例
2019/12/28 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
2020/02/18 Python
Pandas实现一列数据分隔为两列
2020/05/18 Python
canvas 下载二维码和图片加水印的方法
2018/03/21 HTML / CSS
美国高级工作服品牌:Carhartt
2018/01/25 全球购物
LightInTheBox法国站:中国跨境电商
2020/03/05 全球购物
简述数据库的设计过程
2015/06/22 面试题
师范类求职信
2014/06/21 职场文书
高考学习决心书
2015/02/04 职场文书
童年读书笔记
2015/06/26 职场文书
MySQL时间盲注的五种延时方法实现
2021/05/18 MySQL
bose降噪耳机音能消除人声吗
2022/04/19 数码科技
Python按顺序遍历并读取文件夹中文件
2022/04/29 Python
SpringBoot前端后端分离之Nginx服务器下载安装过程
2022/08/14 Servers