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()这种拼写。
相关文章推荐:http://www.cnblogs.com/huxi/archive/2010/06/26/1765808.html

转载于:https://www.cnblogs.com/xiaoblue/p/9410721.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/485489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode--33. 搜索旋转排序数组

假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。 你可以假设数组中不存在…

北理计算机教案,北理工版三年级信息技术教案重点.docx

第1单元 初识神奇计算机第1课 神奇电子计算机【教学目的和要求】1、学生了解计算机组成各部分的名称和作用。2、学生知道什么是计算机软件,了解计算机软件的作用。3、学生了解计算机处理信息的过程。4、学会正确启动与关闭计算机。【教学重点】教学难点:…

Leetcode--162. 寻找峰值

峰值元素是指其值大于左右相邻值的元素。 给定一个输入数组 nums,其中 nums[i] ≠ nums[i1],找到峰值元素并返回其索引。 数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。 你可以假设 nums[-1] nums[n] -…

计算机发展历程按什么划分,计算机的发展阶段是按什么划分的

大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。计算机的发展阶段是按电子元件划分的,具体阶段如下:1、第1代为电子管数字机( 1946到1958年)。硬件方面,逻辑元件采用的是真空电子管,主存储器采用汞延迟线、阴…

因果推理、正则化上榜:权威专家盘点过去50年最重要的统计学思想

来源:机器学习研究组订阅在日常生活中,统计学无处不在,每个人、每件事似乎都可以使用统计数据加以说明。随着人类迈入大数据时代,统计学在方方面面更是发挥了不可或缺的作用。统计学思想,就是在统计实际工作、统计学理…

Nginx正向与反向代理

Nginx 主要用于反向代理与负载均衡 什么是代理服务器(Proxy Serve)? 提供代理服务的电脑系统或其它类型的网络终端,代替网络用户去取得网络信息。 为什么使用代理服务器? 提高访问速度 由于目标主机返回的数据会存放在代理服务…

计算机组成原理延迟时间ty,计算机组成原理第6章_5运算方法.ppt

文档介绍:6.5 算术逻辑单元一、ALU 电路四位 ALU 74181M 0 算术运算M 1 逻辑运算S3 ~ S0 不同取值,可做不同运算ALUAiBiFi…SiM位片式运算器4位双极型位片式运算器AM2901,它将ALU、通用寄存器组、多路开关、移位器等逻辑构件集成在一个芯片内。通用寄存器寄存器写…

Leetcode--172. 阶乘后的零

给定一个整数 n,返回 n! 结果尾数中零的数量。 示例 1: 输入: 3 输出: 0 解释: 3! 6, 尾数中没有零。 示例 2: 输入: 5 输出: 1 解释: 5! 120, 尾数中有 1 个零. 说明: 你算法的时间复杂度应为 O(log n) 。 思路: 能出现零的因子里面一定出现2&am…

生命起源的奥秘:分子生物学对生命起源研究

来源: 科学技术哲学1993年加州大学柏克利分校的詹腓力教授邀请了一批科学家、哲学家到加州中部的一个海滨小镇相聚。这些学者来自著名的学术中心,包括剑桥、慕尼黑、芝加哥大学等学府,他们是来质疑一个统治了科学界长达150年的学说。保罗.尼尔…

Python学习第二天

运算符类型: 1.算术运算符 a 10*10 2.赋值运算 a a 1 3.比较运算 a 1 > 5 4.逻辑运算 a 1>6 or 11 5.成员运算 a "文" in "郑建文" 基本数据类型 数字  int 字符串  str 列表  list 元祖  tuple 字典  dict 布尔值  b…

Promise,async和js的事件循环机制

Promise Promise有等待,已成功,失败,三种状态,状态的改变会触发then回调函数和catch回调函数。 当执行一个Promise时,它会立刻返回一个Promise对象,并且不会阻塞后续代码执行。 当Promise的状态发生改变后…

介绍计算机硬件的情景剧表演,手忙脚乱的情景剧

继去年一手操办了女儿班上的元旦迎新会后,昨天,我再一次自编自演自导。不得不说,学校真是磨练人的地方。一、创作剧本的起因半个月前,宋老师推荐我和女儿参加学校举行的亲子诵读比赛。去年也参与过一次,我己经形成了固…

java 双因素认证(2FA)TOTP demo

TOTP 的全称是"基于时间的一次性密码"(Time-based One-time Password)。它是公认的可靠解决方案,已经写入国际标准 RFC6238。 很早就知道有这个东西了,一直不知道是怎么实现的. 比如 QQ 安全中心的密钥,U盾,就是动态密码…

win7计算机管理中看不到新加的硬盘,win7系统看不到第二块硬盘的解决方法.

win7系统想必大家都非常熟悉吧,然而有时候可能会碰到win7系统看不到第二块硬盘的情况,想必大家都遇到过win7系统看不到第二块硬盘的情况吧,那么应该怎么处理win7系统看不到第二块硬盘呢?我们依照1、进入win7系统控制面板&#xff…

美国航空发动机发展经验,给中国的启示!

内容来源:网络本期编辑:小艾 航空发动机是装备制造领域的最高端产品,代表了装备制造业的最高技术水平,被誉为现代工业“皇冠上的明珠”,其重要性一向为人所强调,但成为航空发动机强国的道路之艰难却往往为人…

session的钝化和活化

钝化:内存->硬盘 活化:硬盘->内存 session对象的四种状态: 1.session.setAttribute("a",xxx),将对象a绑定到session中 2.session.removeAttribute("a"),将对象a从session中解绑 监听session对象的…

华师 计算机系统 作业,华师网络学院作业答案-计算机组成原理问答题

华师网络学院作业答案-计算机组成原理问答题 (4页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!9.9 积分试谈谈什么是存储系统的高速缓冲存储器(Cache), 画出“主存- Cache”这一存储层次…

第五十四篇 Linux相关——远程连接SSH

No.1. SSH(Secure Shell)安全外壳协议建立在应用层基础上的安全协议可靠,专为远程登录会话和其他网络服务提供安全性的协议有效防止远程管理过程中的信息泄漏问题SSH客户端适用于多种平台SSH服务器端几乎支持所有Unix平台No.2. 服务器安装SSH…

《2020城市大脑全球标准研究报告》全文正式开放申领

2020年12月23日,《2020城市大脑全球标准研究报告》在北京正式发布,提出了城市大脑建设标准的研究方向和初步成果,内容包括: 城市大脑的顶层建设规范、整体技术架构、云反射弧机制、运行安全、城市神经元的种类划分、识别编码、空…

Leetcode--91. 解码方法

一条包含字母 A-Z 的消息通过以下方式进行了编码: A -> 1 B -> 2 ... Z -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数。 示例 1: 输入: "12" 输出: 2 解释: 它可以解码为 "AB"(1 2&#xff0…