RLock Objects

可重入锁是一个同步原语,它可以被同一个线程多次获取。在内部,除了原始锁使用的锁定/解锁状态之外,它还使用“线程拥有”和“递归级别”的概念。在锁定状态下,某些线程拥有锁;在未锁定状态下,没有线程拥有它。

为了锁定该锁,线程调用它的acquire()方法,一旦线程拥有锁就会返回。解锁则调用它的release()方法。acquire()/release()成对调用且可被嵌套;只有调用最后的release()(最外层对中的release())才会将锁重置为解除状态并允许其他线程通过acquire()方法进行阻塞。

RLock.acquire([blocking=1]) 获取锁,阻塞或非阻塞

  • 当不传递参数调用时: 如果线程已经拥有锁,则递归等级加一,并立即返回。否则,如果其他的参数拥有锁,则阻塞(等待)直到该锁解除。一旦该锁解除(不再被其他线程所拥有),立即夺得所有权,将递归等级设置为一并返回。如果有更多的线程处于阻塞中则等待直到锁解除,每次只有一个线程能获得锁的所有权。在这种调用情况(不传递参数)下没有返回值。
  • 当设置blocking为True调用时: 情况与不传递参数值时相同,并返回true
  • 当设置blocking为False调用时: 不阻塞,如果一个不传递参数的调用将导致阻塞则立即返回false(*);否则,则与不传递参数调用相同,并返回true
  • *:经过实验与个人理解,这句话的含义为该调用方式不会等待阻塞结束,当其他线程拥有锁即处于阻塞状态时,该调用会立即返回false

RLock.release()

  • 释放锁,递减递归等级。如果在递减之后递归等级为零,则将锁重置为解锁状态(不被任何线程所拥有),若此时有其他线程被阻塞等待锁解锁,则允许其中一个线程继续执行。如果在递减之后递归等级不为零,则锁仍被锁住并归调用线程所有。
  • 只有在调用线程拥有锁时才能调用此方法,否则会引发运行时错误
  • 该方法无返回值

Condition Objects

Condition(条件变量)通常与一个锁关联。需要在多个Contidion中共享一个锁时,这可以传递,默认情况将会生成一个(*)(当多个条件变量必须共享同一个锁时,传入一个锁是有用的)

*:可以传递一个Lock/RLock实例给构造方法,否则它将自己生成一个实例

一个条件变量的acquire()和release()方法会调用关联锁的相应方法。它还有wait(),notify()和notifyAll()方法,只有调用线程拥有锁时才可以调用这三个方法,否则将产生运行时错误。

wait()方法会释放锁,并且阻塞直到notify()或notifyAll()方法调用另一个线程中的相同条件变量唤醒它。一旦被唤醒,它立即重新获得锁并返回。调用时可指定timeout(超时时间)

notify()方法唤醒一个等待条件变量的线程,如果有等待的话。notifyAll()方法唤醒所有等待条件变量的线程。

注意:notify()和notifyAll()方法不会释放锁,这意味着线程或被唤醒的线程不会立即从它们的wait()调用中返回,但只有调用notify()和notifyAll()的线程才会最终放弃锁的所有权(并返回)

小贴士:略

class threading.Condition([lock])

如果lock参数被设定且不为None,则其必须为Lock或RLock对象,且它会被作为基础锁。否则,会创建一个Rlock对象作为基础锁。

  • acquire(*args)    获取基础锁。该方法会调用基础锁的相应方法,其返回值就是该方法的返回值
  • release()     释放基础锁。该方法会调用基础锁的相应方法,无返回值
  • wait([timeout])     等待直到通知或超时发生。若调用该方法的线程没有获得锁则会产生一个运行时错误。该方法会释放基础锁,并且 阻塞直到notify()或notifyAll()方法调用另一个线程中的相同条件变量唤醒它,或者直到可选的超时发生。一旦被唤醒或者超时,它重新获得锁并返回。当timeout参数被提供且不为None,它应该是一个浮点数,指定以秒为单位的操作超时(或分数)。当基础锁为Rlock时,它不使用其release()方法进行释放,因为当它多次被递归获得时,它可能不会真正的解锁。相反,一个RLock类的内部接口会被使用,即使递归地获取了多次,它也会解除锁定。接下来重新获得锁时会调用另一个内部接口以恢复存储的(之前的)递归等级。
  • notify(n=1)   默认情况下,唤醒一个等待该条件的线程,如果有的话。如果调用该方法的线程没有获得锁,会产生一个运行时错误。该方法最多唤醒n个等待条件变量的线程,如果没有线程等待,这会是一个空指令。如果至少有n个线程在等待,则当前实现将唤醒n个线程,然而依靠这种行为是不安全的,一个未来优化的实现有时会唤醒超过n个线程。    注意:一个被唤醒的线程实际上不会从它的wait()调用中返回直到它重新获得锁,因为notify()不会释放锁,它的调用者应该清楚。
  • notifyAll()(notify_all())    唤醒所有等待条件的线程,该方法的行为与notify()相似但唤醒所有等待的线程而不是单单一个。如果调用该方法时调用线程没有获得锁,则会产生一个运行时错误。在版本2.6中添加了notify_all()这种拼写。
 
 
相关文章推荐:http://www.cnblogs.com/huxi/archive/2010/06/26/1765808.html
  
 

python2.7 threading RLock/Condition文档翻译 (RLock/Condition详解)的更多相关文章

  1. Condition的await-signal流程详解

    转载请注明出处:http://blog.csdn.net/luonanqin 上一篇讲了ReentrantLock的lock-unlock流程,今天这篇讲讲Condition的await-signal ...

  2. Condition的await-signal流程详解(转)

    上一篇文章梳理了condtion,其中侧重流程,网上看到这篇文章文章介绍的很细.值得学习.特意转载过来.   转载请注明出处:http://blog.csdn.net/luonanqin 转载路径:h ...

  3. python2.7中MySQLdb的安装与使用详解

    Python2.7中MySQLdb的使用 import MySQLdb #1.建立连接 connect = MySQLdb.connect( '127.0.0.1', #数据库地址 'root', # ...

  4. java线程并发控制:ReentrantLock Condition使用详解

    本文摘自:http://outofmemory.cn/java/java.util.concurrent/lock-reentrantlock-condition java的java.util.con ...

  5. [C]if (CONDITION)语句中CONDITION的情况

    编译环境: Ubuntu 12.04: gcc Windows XP : VS-2005 深入一下if (CONDITION)语句中CONDITION的情况.即CONDITION何时为真,何时是假. ...

  6. Java精通并发-Condition详解及相比于传统线程并发模式的改进

    在上一次https://www.cnblogs.com/webor2006/p/11792954.html对于Lock的具体实现类ReentrantLock用了一个示例对它进行了一个简单的了解,而它其 ...

  7. Java并发包源码学习系列:详解Condition条件队列、signal和await

    目录 Condition接口 AQS条件变量的支持之ConditionObject内部类 回顾AQS中的Node void await() 添加到条件队列 Node addConditionWaite ...

  8. 详解AQS中的condition源码原理

    摘要:condition用于显式的等待通知,等待过程可以挂起并释放锁,唤醒后重新拿到锁. 本文分享自华为云社区<AQS中的condition源码原理详细分析>,作者:breakDawn. ...

  9. python中threading模块详解(一)

    python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ...

随机推荐

  1. SQL server Profiler 监视数据库活动

    做网站后台开始时需要考虑后台对数据库的一些操作,比如尽量减少查询次数,尽快释放连接,只选取必须的字段等等.如果是用三层开发,复杂的项目中直接拼装SQL语句多一点,拼装的SQL语句可以直接在SQL se ...

  2. Doclever 接口mock 操作

    查看 接口项目mock 查看说明 假设 本机项目路径为  http://localhost:8080 >> 启动 node node net.js http://org.my.com/mo ...

  3. TCP/IP 基础简介

    引言本篇属于TCP/IP协议的基础知识,重点介绍了TCP/IP协议簇的内容.作用以及TCP.UDP.IP三种常见网络协议相关的基础知识. 内容TCP/IP协议簇是由OSI七层模型发展而来的,之所以存在 ...

  4. Linux常用基本命令( ls, alias)

    ls命令 作用:列举目录文件信息( list directory content ) 格式:ls [option] [file] 1,命令不跟任何选项与目录,表示列举当前目录的文件信息 ghostwu ...

  5. centos7下docker发布第一个微服务应用(Eureka)

    1.在windows下打包 微服务应用通过maven进行打包,在项目的pom.xml执行mvn clean package,或者直接通过idea或者eclipse进行maven打包 之上操作将在项目的 ...

  6. JavaScript数组&类数组转换

    一.数组 在JavaScript中数组可以容纳任何类型的值,可以是数字.字符串.对象.甚至其他数组(多为数组) var a = [1,'2',[3]]; a.length;//3 a[0];//1 a ...

  7. JS---函数名和变量名重名

    继续作用域的问题,今天上午看了一会,下午看又看到了一个类型的题,函数名和变量名相同的问题.之前还不会觉得函数名和变量名重名了会有什么冲突.也是没有去测试过..懒了.直接贴代码: 运行之后大家猜测结果是 ...

  8. 配置方法数超过 64K 的应用

    随着 Android 平台的持续成长,Android 应用的大小也在增加.当您的应用及其引用的库达到特定大小时,您会遇到构建错误,指明您的应用已达到 Android 应用构建架构的极限.早期版本的构建 ...

  9. WOSA/XFS PTR Form解析库—FormRule.h

    #ifndef _FORMRULE_H_#define _FORMRULE_H_ #include <XFSPTR.H>#include <string>#include &l ...

  10. 记一款bug管理系统(bugdone.cn)的开发过程(3) - 永久免费化

    BugDone永久免费了! BugDone(bug管理工具)已经发布有一阵子了,自发布以来注册用户量.项目创建量稳步提升,并且得到了很多用户的好评. 在开发BugDone工具之前,我们团队也曾为找不到 ...