threading 官方 线程对象和锁对象以及条件对象condition
官方地址:https://docs.python.org/2/library/threading.html#thread-objects
以下只截取condition部分,其他Lock()以及threading 部分见上述链接
16.2.4。条件对象
条件变量总是与某种锁定相关联。可以传入,也可以默认创建一个。(当多个条件变量必须共享相同的锁时,传递一个输入很有用。)
条件变量具有acquire()
和release()
方法,它们调用关联锁的相应方法。它也有一个wait()
方法,notify()
和notifyAll()
方法。只有在调用线程获得了锁时才必须调用这三个对象,否则 RuntimeError
引发a。
该wait()
方法释放该锁,然后阻塞直到被a notify()
或notifyAll()
另一个线程中的相同条件变量调用唤醒。唤醒后,它将重新获取锁并返回。也可以指定超时。
该notify()
方法唤醒等待条件变量的线程之一(如果有的话)。该notifyAll()
方法唤醒所有等待条件变量的线程。
注意:notify()
和notifyAll()
方法不会释放锁;这意味着被唤醒的一个或多个线程不会wait()
立即从其调用中返回,而仅在调用notify()
或notifyAll()
最终放弃了锁所有权的线程时 才会返回 。
提示:使用条件变量的典型编程风格使用锁来同步对某些共享状态的访问;对状态的特定更改感兴趣的线程会wait()
反复调用,直到它们看到所需的状态为止;而对状态调用进行修改的线程notify()
或 notifyAll()
当它们以某种方式改变状态(对于一个侍者来说可能是所需的状态)时,线程将反复调用它们。例如,以下代码是具有无限缓冲区容量的一般生产者-消费者情况:
# Consume one item
cv.acquire()
while not an_item_is_available():
cv.wait()
get_an_available_item()
cv.release() # Produce one item
cv.acquire()
make_an_item_available()
cv.notify()
cv.release()
要在notify()
和之间进行选择notifyAll()
,请考虑一种状态更改是否仅对一个或多个等待线程有意义。例如,在典型的生产者-消费者情况下,向缓冲区添加一项仅需要唤醒一个消费者线程。
- 类
threading.
Condition
([ 锁] ) -
如果指定了lock参数,但未指定参数,则该参数
None
必须是aLock
或RLock
object,并用作基础锁。否则,将RLock
创建一个新对象并将其用作基础锁。acquire
(* args )-
获取基础锁。此方法在基础锁上调用相应的方法;返回值就是该方法返回的值。
release
()-
释放基础锁。此方法在基础锁上调用相应的方法;没有返回值。
wait
([ 超时] )-
等到收到通知或发生超时为止。如果在调用此方法时调用线程未获取锁,
RuntimeError
则会引发a。此方法释放基础锁,然后进行阻塞,直到被a
notify()
或notifyAll()
在另一个线程中调用相同条件变量唤醒,或者直到发生可选的超时为止。一旦唤醒或超时,它将重新获取锁并返回。如果存在timeout参数而不是timeout参数
None
,则它应该是一个浮点数,以秒为单位(或几分之一)指定操作的超时时间。当基础锁为时
RLock
,它不会使用其release()
方法释放,因为当递归获取多次锁时,它实际上可能无法解锁。而是RLock
使用该类的内部接口,即使递归获取了几次,它也可以真正将其解锁。重新获得锁定后,另一个内部接口将用于恢复递归级别。
notify
(n = 1 )-
默认情况下,唤醒一个线程等待这种情况(如果有)。如果在调用此方法时调用线程未获取锁,
RuntimeError
则会引发a。该方法最多唤醒n个等待条件变量的线程。如果没有线程在等待,则为空操作。
如果至少有n个 线程正在等待,则当前实现将恰好唤醒n 个线程。但是,依靠这种行为并不安全。未来的优化实现有时可能会唤醒 n个以上的线程。
notify_all
()notifyAll
()¶-
唤醒所有在这种情况下等待的线程。此方法的行为类似于
notify()
,但是唤醒所有等待的线程而不是一个。如果在调用此方法时调用线程未获取锁,RuntimeError
则会引发a。在2.6版中进行了更改:添加了
notify_all()
拼写。
threading 官方 线程对象和锁对象以及条件对象condition的更多相关文章
- 锁对象-条件对象-synchronized关键字
1 import java.util.concurrent.locks.Condition; 2 import java.util.concurrent.locks.Lock; 3 import ja ...
- 深入理解JVM(7)——线程安全和锁优化
Java中的线程安全 按照线程安全的“安全程度”由强至弱来排序,可以将Java语中各种操作共享的数据分为以下5类:不可变. 绝对线程安全. 相对线程安全. 线程兼容和线程对立. 1.不可变 不变的对象 ...
- 《深入理解Java虚拟机》-----第13章 线程安全与锁优化
概述 在软件业发展的初期,程序编写都是以算法为核心的,程序员会把数据和过程分别作为独立的部分来考虑,数据代表问题空间中的客体,程序代码则用于处理这些数据,这种思维方式直接站在计算机的角度去抽象问题和解 ...
- JVM(8) 线程安全与锁优化
面向过程编程:程序编写以算法为核心,程序员会把数据和过程分别作为独立的部分来考虑,数据代表问题空间的客体,程序代码则用于处理这些数据.这种思维方式直接站在计算机的角度去抽象问题和解决问题,称为面向过程 ...
- JVM之java并发 ——线程安全与锁优化
概述 人们很难想象现实中的对象在一项工作进行期间,会被不停地中断和切换,对象的属性(数据)可能会在中断期间被修改和变“脏”,而这些事情在计算机世界中则是很正常的事情.有时候,良好的设计原则不得不向现实 ...
- JVM学习记录-线程安全与锁优化(一)
前言 线程:程序流执行的最小单元.线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址.文件I/O等),又可以独立调度(线程是C ...
- java 多线程(三)条件对象
转载请注明出处:http://blog.csdn.net/xingjiarong/article/details/47417383 在上一篇博客中,我们学会了用ReentrantLock来控制线程訪问 ...
- 一夜搞懂 | JVM 线程安全与锁优化
前言 本文已经收录到我的 Github 个人博客,欢迎大佬们光临寒舍: 我的 GIthub 博客 学习导图 一.为什么要学习内存模型与线程? 之前我们学习了内存模型和线程,了解了 JMM 和线程,初步 ...
- 第一节:《线程安全和锁Synchronized概念》
第一节:线程安全和锁Synchronized概念 一.进程与线程的概念 (1)在传统的操作系统中,程序并不能独立运行,作为资源分配和独立运行的基本单位都是进程. 在未配置 OS 的系统中,程序的执行方 ...
随机推荐
- 记PHP使用rtrim()导致获得的数据乱码问题
一.问题描述: 我用rtrim()函数去除右侧多余的"."号,去除之后,发现乱码. 二.出现原因: 当右侧没有分号,要去除的字符串的十六进制又刚刚好以81结尾,就导致81被去除,从 ...
- 375. 猜数字大小 II
题目: 链接:https://leetcode-cn.com/problems/guess-number-higher-or-lower-ii/ 我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 ...
- 使用nohup不产生log文件方法
思想 无法阻止nohup产生日志可以将其定向到空文件实现 实现 $ nohup xxx >/dev/null 2>&1 &
- vue中jquery详情
jQuery基本语法 $(selector).action() 基本选择器:$("#id") 标签选择器:$("tagName") class选择器:$(&qu ...
- eclipse调字体大小
首先调java字体: Window -> Preferences -> General -> Appearance -> Colors and Fonts -> Java ...
- PP: DeepAR: probabilistic forecasting with autoregressive recurrent networks
FROM Amazon research Germany PROBLEM probabilistic forecasting: estimate the probability distributio ...
- 使用饿了么el-date-picker里及如何将后台给的时间戳js转化为时间格式
首先代码是这个样子的,使用v-model <el-date-picker v-model="formData.createTime" :disabled="true ...
- javax.naming.NameNotFoundException: Name jdbc is not bound in this Context
这个错误的原因是没有项目使用到了Tomcat中配置的数据源(但是你本地没有配置),关于什么是JNDI看这篇文章就够了® 今天导入一个项目(比较老的),在本地运行时报错: Cannot resolve ...
- python3练习100题——033
链接:http://www.runoob.com/python/python-exercise-example33.html 题目:按逗号分隔列表. l=[1,2,3,4] k=1 for i in ...
- 10.pandas的替换和部分替换(replace)
在处理数据的时候,很多时候会遇到批量替换的情况,如果一个一个去修改效率过低,也容易出错.replace()是很好的方法. 源数据 1.替换全部或者某一行 replace的基本结构是:df.repl ...