Python多线程编程(六):可重入锁RLock

 更新时间:2015年04月05日 11:39:52   投稿:junjie  
这篇文章主要介绍了Python多线程编程(六):可重入锁RLock,本文直接给出使用实例,然后讲解如何使用RLock避免死锁,需要的朋友可以参考下

考虑这种情况:如果一个线程遇到锁嵌套的情况该怎么办,这个嵌套是指当我一个线程在获取临界资源时,又需要再次获取。

根据这种情况,代码如下:

复制代码 代码如下:

'''
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进阶多线程爬取网页项目实战

    这篇文章主要为大家介绍了Python进阶,Python多线程爬取网页项目实战的示例呈现步骤,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-10-10
  • 让你分分钟学会python条件语句

    让你分分钟学会python条件语句

    学好Python和条件语句,将方便有效提高工作效率,这篇文章主要给大家介绍了关于python条件语句的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-08-08
  • Python的turtle绘图库使用基础

    Python的turtle绘图库使用基础

    turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形,需要的朋友可以参考下
    2023-04-04
  • python进行图片相似度对比的两种实现方法

    python进行图片相似度对比的两种实现方法

    Python提供了一些库和工具可以用于图片的相似度比对,本文就详细的介绍了两种实现方法,感知哈希和结构相似性,下面就来介绍一下,感兴趣的可以了解一下
    2023-10-10
  • pandas滑动窗口学习笔记(shift, diff, pct_change)

    pandas滑动窗口学习笔记(shift, diff, pct_change)

    pandas中有3类窗口,分别是滑动窗口rolling 、扩张窗口expanding以及指数加权窗口ewm,下面就来详细的介绍一下这三种的用法,感兴趣的可以了解一下
    2024-03-03
  • 详解appium+python 启动一个app步骤

    详解appium+python 启动一个app步骤

    这篇文章主要介绍了详解appium+python 启动一个app步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • 快速进修Python指南之文件操作

    快速进修Python指南之文件操作

    这篇文章主要为大家介绍了Java开发者快速进修Python指南之文件操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • python基础教程之获取本机ip数据包示例

    python基础教程之获取本机ip数据包示例

    本文主要介绍了python获取本机ip数据包的示例,大家参考使用吧
    2014-02-02
  • 让python json encode datetime类型

    让python json encode datetime类型

    python2.6+ 自带的json模块,不支持datetime的json encode,每次都需要手动转为字符串,很累人,我们可以自己封装一个简单的方法处理此问题。
    2010-12-12
  • Django框架模板用法详解

    Django框架模板用法详解

    本文详细讲解了Django框架中模板的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06

最新评论