官方地址: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. WebMethods开发入门

    webMethods  Integration Platform 由用于设计.执行和管理集成解决方案的 3 类组件构成. 设计时组件:这些组件提供了开发和测试集成解决方案的工具. 1.webMetho ...

  2. A函数跨区域

    ODerController.class.php内容如下 1 <?php /* * To change this license header, choose License Headers i ...

  3. markdwon编辑公式入门

    上标与下标   上标和下标分别使用^ 与_ ,例如\(x_i^2\)表示的是:.   默认情况下,上.下标符号仅仅对下一个组起作用.一个组即单个字符或者使用{..} 包裹起来的内容.如果使用\(10^ ...

  4. 一个简单的java web项目 仅实现添加

    连接数据库已经进行判断 要求: 1登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头:(1分) 2登录密码:要求显示“• ”或“*”表示输入位数,密码要求八位以上字母.数字组成.(1分 ...

  5. rp算法 随机化 刷题记录

    刷随机化是真的会上瘾quq 洛谷P3973 [TJOI2015]线性代数 看oiwiki上说可以随机化...于是... 就随机在a[i]上选一位取反,然后更新答案,最后输出答案. ...无话可说 代码 ...

  6. Switch The LED Holiday Light To Illuminate The Cheerful Holidays

    I like how LED holiday lights add a little magic to the holidays. Want an easy way to reduce your va ...

  7. Wannafly Camp 2020 Day 2A 托米的字符串

    #include <bits/stdc++.h> using namespace std; const int N = 1000005; int n; char str[N]; int a ...

  8. linux - mysql - 忘记用户名、密码

    1, 关闭mysql服务 /etc/rc.d/init.d/mysqld stop 2,使用 –skip-grant-tables选项启动mysql服务 (1)打开文件 mysqld vi /etc/ ...

  9. 10个Python 初学者必知编码小技巧

          技巧 #1   字符串翻转 >>> a = "codementor" >>> print "Reverse is" ...

  10. 手机app测试要点(复制文)

    一.简介 移动应用App已经渗透到每个人的生活.娱乐.学习.工作当中,令人激动.兴奋且具有创造性的各种App犹如雨后春笋般交付到用户手中.各类智能终端也在快速发布,而开发者对于全球移动设备的质量和性能 ...