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 ...
随机推荐
- 递推、数位DP解析(以HDU 2089 和 HDU 3555 为例)
HDU 2089 不要62 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2089 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人 ...
- C# WebApi 返回JSON
在默认情况下,当我们新建一个webapi项目,会自动返回XML格式的数据,如果我们想返回JSON的数据,可以设置下面的三种方法. 1. 不用改配置文件,在Controller的方法中,直接返回Http ...
- 选择ORACLE数据库字符集
如何选择数据库的字符集是一个有争议的话题,字符集本身涉及的范围很广,它与应用程序.客户的本地环境.操作系统.服务器等关系很密切,因此要做出合适的 选择,需要明白这些因素之间的关系.另外对字符集的基本概 ...
- [日常] Go语言圣经--复数,布尔值,字符串习题
go语言圣经-复数 1.我们把形如a+bi(a,b均为实数)的数称为复数,其中a称为实部,b称为虚部,i称为虚数单位.两种精度的复数类型:complex64和complex128,分别对应float3 ...
- [android] 切换按钮-自定义控件-拖动效果
重写View的onTouchEvent()方法,传递进来MotionEvent对象 调用MotionEvent对象的getAction()方法,获取当前动作 switch判断一下当前动作 事件为Mot ...
- Redis简介及应用场景
一丶Redis介绍 Redis是一个开源的 key—value型 单线程 数据库,支持string.list.set.zset和hash类型数据. 默认端口:6379 默认数据库数量:16 二.优点: ...
- 吉哥系列故事——临时工计划(dp)
吉哥系列故事——临时工计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total ...
- 数据库导入导出expdp,impdp
数据库操作 (1)数据库导入导出expdp,impdp 在导入导出数据库的时候,经常会用到exp和imp,在数据量小的情况下可以随意使用,但是当数据量大,表中数据有百万,千万条的时候,就要等好久好久好 ...
- Linux中编译安装软件的基本流程
1. 准备软件包源文件 从互联网下载相应的软件包(以 .tar.gz 或 .tar.bz2 为后缀),将tarball文件解压到/usr/local/src目录下,并切换到软件包目录下 : 2. ./ ...
- Software-Defined Networking A Comprehensive Survey --阅读_day2
3. 什么是SDN?(WHAT IS SOFTWARE-DEFINED NETWORKING?) The term SDN was originally coined to represent the ...