官方地址: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必须是a Lock 或RLockobject,并用作基础锁。否则,将RLock创建一个新对象并将其用作基础锁。

acquire* args 

获取基础锁。此方法在基础锁上调用相应的方法;返回值就是该方法返回的值。

release()

释放基础锁。此方法在基础锁上调用相应的方法;没有返回值。

wait([ 超时] )

等到收到通知或发生超时为止。如果在调用此方法时调用线程未获取锁,RuntimeError则会引发a。

此方法释放基础锁,然后进行阻塞,直到被a notify()notifyAll()在另一个线程中调用相同条件变量唤醒,或者直到发生可选的超时为止。一旦唤醒或超时,它将重新获取锁并返回。

如果存在timeout参数而不是timeout参数None,则它应该是一个浮点数,以秒为单位(或几分之一)指定操作的超时时间。

当基础锁为时RLock,它不会使用其release()方法释放,因为当递归获取多次锁时,它实际上可能无法解锁。而是RLock使用该类的内部接口,即使递归获取了几次,它也可以真正将其解锁。重新获得锁定后,另一个内部接口将用于恢复递归级别。

notifyn = 1 

默认情况下,唤醒一个线程等待这种情况(如果有)。如果在调用此方法时调用线程未获取锁, RuntimeError则会引发a。

该方法最多唤醒n个等待条件变量的线程。如果没有线程在等待,则为空操作。

如果至少有n个 线程正在等待,则当前实现将恰好唤醒线程。但是,依靠这种行为并不安全。未来的优化实现有时可能会唤醒 n个以上的线程。

注意:唤醒的线程wait() 直到可以重新获取锁才真正从调用返回。由于notify()不释放锁,因此它的调用者应该。

notify_all()
notifyAll()

唤醒所有在这种情况下等待的线程。此方法的行为类似于 notify(),但是唤醒所有等待的线程而不是一个。如果在调用此方法时调用线程未获取锁, RuntimeError则会引发a。

在2.6版中进行了更改:添加了notify_all()拼写。

threading 官方 线程对象和锁对象以及条件对象condition的更多相关文章

  1. 锁对象-条件对象-synchronized关键字

    1 import java.util.concurrent.locks.Condition; 2 import java.util.concurrent.locks.Lock; 3 import ja ...

  2. 深入理解JVM(7)——线程安全和锁优化

    Java中的线程安全 按照线程安全的“安全程度”由强至弱来排序,可以将Java语中各种操作共享的数据分为以下5类:不可变. 绝对线程安全. 相对线程安全. 线程兼容和线程对立. 1.不可变 不变的对象 ...

  3. 《深入理解Java虚拟机》-----第13章 线程安全与锁优化

    概述 在软件业发展的初期,程序编写都是以算法为核心的,程序员会把数据和过程分别作为独立的部分来考虑,数据代表问题空间中的客体,程序代码则用于处理这些数据,这种思维方式直接站在计算机的角度去抽象问题和解 ...

  4. JVM(8) 线程安全与锁优化

    面向过程编程:程序编写以算法为核心,程序员会把数据和过程分别作为独立的部分来考虑,数据代表问题空间的客体,程序代码则用于处理这些数据.这种思维方式直接站在计算机的角度去抽象问题和解决问题,称为面向过程 ...

  5. JVM之java并发 ——线程安全与锁优化

    概述 人们很难想象现实中的对象在一项工作进行期间,会被不停地中断和切换,对象的属性(数据)可能会在中断期间被修改和变“脏”,而这些事情在计算机世界中则是很正常的事情.有时候,良好的设计原则不得不向现实 ...

  6. JVM学习记录-线程安全与锁优化(一)

    前言 线程:程序流执行的最小单元.线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址.文件I/O等),又可以独立调度(线程是C ...

  7. java 多线程(三)条件对象

    转载请注明出处:http://blog.csdn.net/xingjiarong/article/details/47417383 在上一篇博客中,我们学会了用ReentrantLock来控制线程訪问 ...

  8. 一夜搞懂 | JVM 线程安全与锁优化

    前言 本文已经收录到我的 Github 个人博客,欢迎大佬们光临寒舍: 我的 GIthub 博客 学习导图 一.为什么要学习内存模型与线程? 之前我们学习了内存模型和线程,了解了 JMM 和线程,初步 ...

  9. 第一节:《线程安全和锁Synchronized概念》

    第一节:线程安全和锁Synchronized概念 一.进程与线程的概念 (1)在传统的操作系统中,程序并不能独立运行,作为资源分配和独立运行的基本单位都是进程. 在未配置 OS 的系统中,程序的执行方 ...

随机推荐

  1. 记PHP使用rtrim()导致获得的数据乱码问题

    一.问题描述: 我用rtrim()函数去除右侧多余的"."号,去除之后,发现乱码. 二.出现原因: 当右侧没有分号,要去除的字符串的十六进制又刚刚好以81结尾,就导致81被去除,从 ...

  2. 375. 猜数字大小 II

    题目: 链接:https://leetcode-cn.com/problems/guess-number-higher-or-lower-ii/ 我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 ...

  3. 使用nohup不产生log文件方法

    思想 无法阻止nohup产生日志可以将其定向到空文件实现 实现 $ nohup xxx >/dev/null 2>&1 &

  4. vue中jquery详情

    jQuery基本语法 $(selector).action() 基本选择器:$("#id") 标签选择器:$("tagName") class选择器:$(&qu ...

  5. eclipse调字体大小

    首先调java字体: Window -> Preferences -> General -> Appearance -> Colors and Fonts -> Java ...

  6. PP: DeepAR: probabilistic forecasting with autoregressive recurrent networks

    FROM Amazon research Germany PROBLEM probabilistic forecasting: estimate the probability distributio ...

  7. 使用饿了么el-date-picker里及如何将后台给的时间戳js转化为时间格式

    首先代码是这个样子的,使用v-model <el-date-picker v-model="formData.createTime" :disabled="true ...

  8. javax.naming.NameNotFoundException: Name jdbc is not bound in this Context

    这个错误的原因是没有项目使用到了Tomcat中配置的数据源(但是你本地没有配置),关于什么是JNDI看这篇文章就够了® 今天导入一个项目(比较老的),在本地运行时报错: Cannot resolve ...

  9. python3练习100题——033

    链接:http://www.runoob.com/python/python-exercise-example33.html 题目:按逗号分隔列表. l=[1,2,3,4] k=1 for i in ...

  10. 10.pandas的替换和部分替换(replace)

    在处理数据的时候,很多时候会遇到批量替换的情况,如果一个一个去修改效率过低,也容易出错.replace()是很好的方法.   源数据 1.替换全部或者某一行 replace的基本结构是:df.repl ...