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 re正则表达式模块(Regular Expression)
Jul 16 Python
Python中的rjust()方法使用详解
May 19 Python
python中map()与zip()操作方法
Feb 27 Python
Python编程之string相关操作实例详解
Jul 22 Python
django项目运行因中文而乱码报错的几种情况解决
Nov 07 Python
python TCP Socket的粘包和分包的处理详解
Feb 09 Python
Python和Go语言的区别总结
Feb 20 Python
Python3.5文件读与写操作经典实例详解
May 01 Python
Python pandas DataFrame操作的实现代码
Jun 21 Python
Python pip 安装与使用(安装、更新、删除)
Oct 06 Python
使用PyTorch实现MNIST手写体识别代码
Jan 18 Python
Flask处理Web表单的实现方法
Jan 31 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
星际争霸任务指南——虫族
2020/03/04 星际争霸
php 破解防盗链图片函数
2008/12/09 PHP
XAMPP安装与使用方法详细解析
2013/11/27 PHP
php遍历删除整个目录及文件的方法
2015/03/13 PHP
PHP函数实现从一个文本字符串中提取关键字的方法
2015/07/01 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
workerman结合laravel开发在线聊天应用的示例代码
2018/10/30 PHP
如何通过Apache在本地配置多个虚拟主机
2020/07/29 PHP
splice slice区别
2006/10/09 Javascript
Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法
2011/01/12 Javascript
jquery ajax学习笔记2 使用XMLHttpRequest对象的responseXML
2011/10/16 Javascript
js实现在文本框光标处添加字符的方法介绍
2012/11/24 Javascript
Javascript之this关键字深入解析
2013/11/12 Javascript
JavaScript中的Primitive对象封装介绍
2014/12/31 Javascript
jQuery+ajax读取并解析XML文件的方法
2016/09/09 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
2016/11/09 Javascript
利用js定义一个导航条菜单
2017/03/14 Javascript
JavaScript事件方法(实例讲解)
2017/06/27 Javascript
JavaScript实现设置默认日期范围为最近40天的方法分析
2017/07/12 Javascript
Express的HTTP重定向到HTTPS的方法
2018/06/06 Javascript
微信小程序使用canvas的画图操作示例
2019/01/18 Javascript
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
2019/06/27 Javascript
vue项目启动出现cannot GET /服务错误的解决方法
2020/04/26 Javascript
浅析 Vue 3.0 的组装式 API(一)
2020/08/31 Javascript
vue elementui tree 任意级别拖拽功能代码
2020/08/31 Javascript
[03:54]Ehome出征西雅图 回顾2016国际邀请赛晋级之路
2016/08/02 DOTA
详解Python之unittest单元测试代码
2018/01/24 Python
Python3自动签到 定时任务 判断节假日的实例
2018/11/13 Python
python实现贪吃蛇小游戏
2020/03/21 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
2020/04/14 Python
使用canvas绘制贝塞尔曲线
2014/12/17 HTML / CSS
HTML5 History API 实现无刷新跳转
2016/01/11 HTML / CSS
ASOS西班牙官网:英国在线时尚和美容零售商
2020/01/10 全球购物
优秀中学生事迹材料
2014/01/31 职场文书
2014年房地产销售工作总结
2014/12/01 职场文书
投诉信范文
2015/07/02 职场文书