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. 处理html内容,获取纯文本

    import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import java.util.rege ...

  2. SpringMvc+hibernate+easyui简单的权限管理系统

    用户登录:   主界面:   资源管理:   角色管理:   用户管理:   部门管理:   源码在群共享: 189811613  群满了,直接发链接吧链接:http://pan.baidu.com/ ...

  3. 解决 iframe 后退不是主页面后退(浏览器 history)问题

    前言:项目中的主页面里有 iframe,切换 iframe 的 src 地址之后,再点浏览器的回退之后,会导致 iframe 里面回退,而不是主页面回退. 问题 浏览器机制的原因,在 iframe 导 ...

  4. Hbuilder配置识别逍遥安卓模拟器

    最近在公司,需要开发一款智能家居APP,用到MUI框架,首先就是环境搭建,写好的APP页面,怎么跑在模拟器上运行? 我的开发环境: HBuilder版本:9.0.2.201803061935 逍遥安卓 ...

  5. JavaScript--DOM操作表格及样式(21)

    一 操作表格 // <table>标签是HTML中结构最为复杂的一个,我们可以通过DOM来创建生成它,或者HTMLDOM来操作它; // 使用DOM来创建表格; var table = d ...

  6. python学习之老男孩python全栈第九期_day011知识点总结

    # 装饰器的形成的过程:最简单的装饰器:有返回值的:有一个参数的:万能参数# 装饰器的作用# 原则:开放封闭原则# 语法糖# 装饰器的固定模式:# def wrapper(f): # 装饰器函数,f是 ...

  7. angular.js 教程 -- 实例讲解

    angular.js AngularJS [1] 诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经被用于Google的多款产品当中.Ang ...

  8. 【代码笔记】iOS-plist获得城市列表

    一,工程图. 二,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the ...

  9. 【读书笔记】iOS-网络-同步请求,队列式异步请求,异步请求的区别

    一,同步请求的最佳实践. 1,只在后台过程中使用同步请求,除非确定访问的是本地文件资源,否则请不要在主线程上使用. 2,只有在知道返回的数据不会超出应用的内存时才使用同步请求.记住,整个响应体都会位于 ...

  10. html基础标签下

    1.1 单标签 ◆注释标签   ctrl+/ ◆水平线标签   <hr> ◆换行标签   <br> 1.2 双标签 ◆段落标签    <p></p> ◆ ...