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写王者荣耀刷金币脚本
Dec 21 Python
解决pip install的时候报错timed out的问题
Jun 12 Python
python实现将读入的多维list转为一维list的方法
Jun 28 Python
用python脚本24小时刷浏览器的访问量方法
Dec 07 Python
Python面向对象程序设计类的封装与继承用法示例
Apr 12 Python
python算法与数据结构之单链表的实现代码
Jun 27 Python
python Elasticsearch索引建立和数据的上传详解
Aug 04 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
Aug 28 Python
python使用itchat模块给心爱的人每天发天气预报
Nov 25 Python
使用keras内置的模型进行图片预测实例
Jun 17 Python
python属于软件吗
Jun 18 Python
jupyter notebook快速入门及使用详解
Nov 13 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
ThinkPHP3.1新特性之查询条件预处理简介
2014/06/19 PHP
php生成zip文件类实例
2015/04/07 PHP
Javascript注入技巧
2007/06/22 Javascript
js实现iframe动态调整高度的代码
2008/01/06 Javascript
Javascript Tab 导航插件 (23个)
2009/06/11 Javascript
jQuery随便控制任意div隐藏的方法
2013/06/28 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
2014/06/19 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
2015/01/31 Javascript
jQuery 移动端拖拽(模块化开发,触摸事件,webpack)
2016/10/28 Javascript
jQuery向webApi提交post json数据
2017/01/16 Javascript
详解vuex 中的 state 在组件中如何监听
2017/05/23 Javascript
Angularjs中使用轮播图指令swiper
2017/05/30 Javascript
关于JavaScript中forEach和each用法浅析
2017/07/27 Javascript
Vue CLI2升级至Vue CLI3的方法步骤
2019/05/20 Javascript
[01:10]DOTA2次级职业联赛 - U5战队宣传片
2014/12/01 DOTA
python中利用Future对象异步返回结果示例代码
2017/09/07 Python
浅谈Pandas中map, applymap and apply的区别
2018/04/10 Python
神经网络(BP)算法Python实现及应用
2018/04/16 Python
详解Django的model查询操作与查询性能优化
2018/10/16 Python
伦敦平价潮流珠宝首饰品牌:Astrid & Miyu
2016/10/10 全球购物
美国肌肉和力量商店:Muscle & Strength
2019/06/22 全球购物
意大利巧克力店:Chocolate Shop
2019/07/24 全球购物
JAVA中的关键字有什么特点
2014/03/07 面试题
幼儿园教师教学反思
2014/02/06 职场文书
中学生演讲稿
2014/04/26 职场文书
教师求职自荐信
2015/03/26 职场文书
计算机实训心得体会
2016/01/14 职场文书
《刷子李》教学反思
2016/02/20 职场文书
青年岗位能手事迹材料(2016推荐版)
2016/03/01 职场文书
销售会议开幕词
2016/03/04 职场文书
优秀创业计划书分享
2019/07/19 职场文书
公司财务制度:成本管理控制制度模板
2019/11/19 职场文书
对Keras自带Loss Function的深入研究
2021/05/25 Python
深入理解python协程
2021/06/15 Python
python 常用的异步框架汇总整理
2021/06/18 Python
图片批量处理 - 尺寸、格式、水印等
2022/03/07 杂记