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

yipeiwu_com6年前Python基础

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

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

复制代码 代码如下:

'''
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()

即可。

相关文章

windows下python虚拟环境virtualenv安装和使用详解

前面介绍了python在ubuntu16.04环境下,python的虚拟环境virtualenv的安装,下面介绍在windows环境下的安装和使用。 环境信息 操作系统:windo...

python django 原生sql 获取数据的例子

如下所示: node2:/django/mysite/blog#cat views.py 1, # -*- coding: utf-8 -*- from __future__ i...

matplotlib绘图实例演示标记路径

matplotlib绘图实例演示标记路径

标记路径 演示效果: 实例代码 import matplotlib.pyplot as plt import matplotlib.path as mpath import num...

Python实现的对本地host127.0.0.1主机进行扫描端口功能示例

Python实现的对本地host127.0.0.1主机进行扫描端口功能示例

本文实例讲述了Python实现的对本地host127.0.0.1主机进行扫描端口功能。分享给大家供大家参考,具体如下: 前面一篇《Python IP端口扫描工具类》详细介绍了端口扫描功能...

解决Python中由于logging模块误用导致的内存泄露

首先介绍下怎么发现的吧, 线上的项目日志是通过 logging 模块打到 syslog 里, 跑了一段时间后发现 syslog 的 UDP 连接超过了 8W, 没错是 8 W. 主要是...