官方地址: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. go append 函数常见操作

    1. 将切片 b 的元素追加到切片 a 之后: a = append(a, b...) 2. 复制切片 a 的元素到新的切片 b 上: 1. b = make([]T, len(a)) 2. copy ...

  2. C# 引入Sqlite 未能加载文件或程序集“System.Data.SQLite

    个人博客 地址:https://www.wenhaofan.com/article/20190501224046 问题 在Visual Studio 中 使用NuGet 通过 install-pack ...

  3. (C语言)学生成绩排序-期末考倒数第二题结构体数组排序

    假设学生的基本信息包括学号.姓名.三门课程成绩以及个人平均成绩,定义一个能够表示学生信息的结构类型.输入n(n<50)个学生的成绩信息,按照学生的个人平均分从高到低输出他们的信息.如果平均分相同 ...

  4. Mysql注入汇总!!!!!!!!!

    师傅tpl!!!!! https://xz.aliyun.com/t/7169[对MYSQL注入相关内容及部分Trick的归类小结] https://www.jianshu.com/p/f261125 ...

  5. LeetCodeTwo Sum IV 树的遍历+Hash大法好

    题意 给定一颗二叉搜索树,返回是否存在两个节点的值之和为给定值K. 思路 同Two Sum.使用Hash表解决.只是要写个树的遍历而已,选取DFS. 源码 class Solution { publi ...

  6. swagger2使用

    添加依赖 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swag ...

  7. PP: A dual-stage attention-based recurrent neural network for time series prediction

    Problem: time series prediction The nonlinear autoregressive exogenous model: The Nonlinear autoregr ...

  8. C语言-基本数据类型

    一.C语言数据类型深度剖析 1.什么是数据类型? -可以理解为固定内存大小的别名 -数据类型是创建变量的模子 -数据类型是对内存的格式化操作 上面三句话如何理解? 在以前的汇编语言时代,我们要存储一些 ...

  9. (转)一致性Hash

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179     一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT) ...

  10. mysql 数据库基础操作

    一 知识储备 MySQL数据库基本操作知识储备 数据库服务器:一台计算机(对内存要求比较高) 数据库管理系统:如mysql,是一个软件 数据库:oldboy_stu,相当于文件夹 表:student, ...