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 socket C/S结构的聊天室应用实现
Nov 30 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
Feb 06 Python
python3 读取Excel表格中的数据
Oct 16 Python
Python3中在Anaconda环境下安装basemap包
Oct 21 Python
对Python多线程读写文件加锁的实例详解
Jan 14 Python
利用Python实现Shp格式向GeoJSON的转换方法
Jul 09 Python
python Pandas如何对数据集随机抽样
Jul 29 Python
python 实现turtle画图并导出图片格式的文件
Dec 07 Python
解决tensorboard多个events文件显示紊乱的问题
Feb 15 Python
Windows下pycharm安装第三方库失败(通用解决方案)
Sep 17 Python
PYTHON使用Matplotlib去实现各种条形图的绘制
Mar 22 Python
如何利用python实现Simhash算法
Jun 28 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 常用函数库和一些实用小技巧
2009/01/01 PHP
PHPWind 发帖回帖Api PHP版打包下载
2010/02/08 PHP
PHP 创建标签云函数代码
2010/05/26 PHP
PHP 文件系统详解
2012/09/13 PHP
php时间戳转换的示例
2014/03/31 PHP
浅谈使用PHP开发微信支付的流程
2015/10/04 PHP
php实现中文转数字
2016/02/18 PHP
Yii实现显示静态页的方法
2016/04/25 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
2017/07/26 PHP
PHP 进度条函数的简单实例
2017/09/19 PHP
JavaScript.Encode手动解码技巧
2010/07/14 Javascript
jquery实现checkbox全选全不选的简单实例
2013/12/31 Javascript
基于javascript实现图片懒加载
2016/01/05 Javascript
精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)
2016/07/01 Javascript
Bootstrap select多选下拉框实现代码
2016/12/23 Javascript
JS运动特效之任意值添加运动的方法分析
2018/01/24 Javascript
使用D3.js构建实时图形的示例代码
2018/08/28 Javascript
Angular进行简单单元测试的实现方法实例
2020/08/16 Javascript
浅析JavaScript预编译和暗示全局变量
2020/09/03 Javascript
python中pygame模块用法实例
2014/10/09 Python
Python脚本获取操作系统版本信息
2016/12/17 Python
Python排序搜索基本算法之冒泡排序实例分析
2017/12/09 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
Python之列表实现栈的工作功能
2019/01/28 Python
python编写猜数字小游戏
2019/10/06 Python
Python内存泄漏和内存溢出的解决方案
2020/09/26 Python
websocket+sockjs+stompjs详解及实例代码
2018/11/30 HTML / CSS
美国环保婴儿用品公司:The Honest Company
2017/11/23 全球购物
理肤泉加拿大官网:La Roche-Posay加拿大
2018/07/06 全球购物
美国在线家居装饰店:Belle&June
2018/10/24 全球购物
汇智创新科技发展有限公司
2015/12/06 面试题
安全员岗位职责
2013/11/11 职场文书
2014年高校辅导员工作总结
2014/12/09 职场文书
2015年机关党委工作总结
2015/05/23 职场文书
钢铁是怎样炼成的读书笔记
2015/06/29 职场文书
Java+swing实现抖音上的表白程序详解
2022/06/25 Java/Android