python2.7 threading RLock/Condition文档翻译 (RLock/Condition详解)
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()这种拼写。
python2.7 threading RLock/Condition文档翻译 (RLock/Condition详解)的更多相关文章
- Condition的await-signal流程详解
		转载请注明出处:http://blog.csdn.net/luonanqin 上一篇讲了ReentrantLock的lock-unlock流程,今天这篇讲讲Condition的await-signal ... 
- Condition的await-signal流程详解(转)
		上一篇文章梳理了condtion,其中侧重流程,网上看到这篇文章文章介绍的很细.值得学习.特意转载过来. 转载请注明出处:http://blog.csdn.net/luonanqin 转载路径:h ... 
- python2.7中MySQLdb的安装与使用详解
		Python2.7中MySQLdb的使用 import MySQLdb #1.建立连接 connect = MySQLdb.connect( '127.0.0.1', #数据库地址 'root', # ... 
- java线程并发控制:ReentrantLock Condition使用详解
		本文摘自:http://outofmemory.cn/java/java.util.concurrent/lock-reentrantlock-condition java的java.util.con ... 
- [C]if (CONDITION)语句中CONDITION的情况
		编译环境: Ubuntu 12.04: gcc Windows XP : VS-2005 深入一下if (CONDITION)语句中CONDITION的情况.即CONDITION何时为真,何时是假. ... 
- Java精通并发-Condition详解及相比于传统线程并发模式的改进
		在上一次https://www.cnblogs.com/webor2006/p/11792954.html对于Lock的具体实现类ReentrantLock用了一个示例对它进行了一个简单的了解,而它其 ... 
- Java并发包源码学习系列:详解Condition条件队列、signal和await
		目录 Condition接口 AQS条件变量的支持之ConditionObject内部类 回顾AQS中的Node void await() 添加到条件队列 Node addConditionWaite ... 
- 详解AQS中的condition源码原理
		摘要:condition用于显式的等待通知,等待过程可以挂起并释放锁,唤醒后重新拿到锁. 本文分享自华为云社区<AQS中的condition源码原理详细分析>,作者:breakDawn. ... 
- python中threading模块详解(一)
		python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ... 
随机推荐
- jQuery选择器遇上一些特殊字符
			学习jQuery过程中,发现一些特殊字符,如“.”,“#”,"(","]"等.它在选择器应用时,按照普通处理就会出错.解决办法,就是使用转义字符来处理,这有点象 ... 
- C#图片处理类
			转载來源:简书 转载作者:幻凌风 转载来源:https://www.jianshu.com/p/e1bab83e87ce using System; using System.Collections; ... 
- Dubbox分布式框架
			一:简介:前身是阿里巴巴的一个开源的项目,后来停止维护,由当当网继续维护,它致力于rpc远程的调度方案.是一个服务框架 二:执行原理图: 节点角色说明: · Provider: 暴露服务的服务提供方. ... 
- .net解决Xss攻击
			首先要明白什么是Xss攻击 XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中.比如这些代码包括HTML代码和客户端脚本.攻击者利用XSS漏 ... 
- SqlSession对象之Executor
			Executor是Mybatis的一个核心接口,每一个SqlSession对象都会拥有一个Executor(执行器对象):这个执行对象负责[增删改查]的具体操作,我们可以简单的将它理解为JDBC中St ... 
- HDU3592(差分约束)
			World Exhibition Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ... 
- div阴影
			.box-shadow{ //Firefox4.0- -moz-box-shadow:投影方式 X轴偏移量 Y轴偏移量阴影模糊半径 阴影扩展半径 阴影颜色; //Safariand Google ch ... 
- LOJ#505. 「LibreOJ β Round」ZQC 的游戏(最大流)
			题意 题目链接 Sol 首先把第一个人能吃掉的食物删掉 然后对每个人预处理出能吃到的食物,直接限流跑最大流就行了 判断一下最后的最大流是否等于重量和 注意一个非常恶心的地方是需要把除1外所有人都吃不到 ... 
- AngularJS单页面路由配置恩,理解了就很简单啦
			利用route实现单页面跳转功能 利用angularJS开发流程 1)配置好angularJS开发环境 2)利用 yo angular projectname创建项目目录 3)删除掉系统自动生成的一些 ... 
- 如何将水晶报表(Crystal Report)导入葡萄城报表
			当从旧的报表平台迁移到葡萄城报表工具时,意味着有大量的报表设计工作要重复去做,如果有一款工具能够在这些工具之间进行自由转换,就能省去报表开发几乎一半的工作量. 葡萄城报表为兼容其他报表控件,提供了简单 ... 
