使用Condition对象可以在某些事件触发或者达到特定的条件后才处理数据,Condition除了具有Lock对象的acquire方法和release方法外,

还有wait方法,notify方法,notifyAll方法等用于条件处理。

条件变量保持线程同步:threading.Condition()

wait():线程挂起,直到收到一个notify通知才会被唤醒继续运行

notify():通知其他线程,那些挂起的线程接到这个通知之后会开始运行

notifyAll(): 如果wait状态线程比较多,notifyAll的作用就是通知所有线程(这个一般用得少)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

PS:有朋友说看了我日志里面的代码也看了注释,但是还是不懂,那今天来个简单的,

用一对屌丝(空白哥和西米哥)的对话来诠释代码(生产者-消费者)原图:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#coding:utf-8
import threading
import time
cond = threading.Condition()
class kongbaige(threading.Thread):
    def __init__(self,
cond, diaosiname):
        threading.Thread.__init__(self,
name 
= diaosiname)
        self.cond = cond
           
    def run(self):
        self.cond.acquire() #获取锁
           
        print self.getName() + ':一支穿云箭'  #空白哥说的第一句话
        self.cond.notify()                   #唤醒其他wait状态的线程(通知西米哥
让他说话)
        #然后进入wait线程挂起状态等待notify通知(等西米哥的回复,接下来俩人就开始扯蛋)
        self.cond.wait()
           
        print self.getName() + ':山无棱,天地合,乃敢与君绝!'
        self.cond.notify()
        self.cond.wait()
           
        print self.getName() + ':紫薇!!!!(此处图片省略)'
        self.cond.notify()
        self.cond.wait()
           
        print self.getName() + ':是你'
        self.cond.notify()
        self.cond.wait()
           
        #这里是空白哥说的最后一段话,接下来就没有对白了
        print self.getName() + ':有钱吗
借点'
        self.cond.notify()             #通知西米哥
        self.cond.release()            #释放锁
           
           
           
class ximige(threading.Thread):
    def __init__(self,
cond, diaosiname):
        threading.Thread.__init__(self,
name 
= diaosiname)
        self.cond = cond
           
    def run(self):
        self.cond.acquire()
        self.cond.wait()   #线程挂起(等西米哥的notify通知)
           
        print self.getName() +':千军万马来相见'
        self.cond.notify()  #说完话了notify空白哥wait的线程
        self.cond.wait()    #线程挂起等待空白哥的notify通知
           
        print self.getName() + ':海可枯,石可烂,激情永不散!'
        self.cond.notify()
        self.cond.wait()
           
        print self.getName() + ':尔康!!!(此处图片省略)'
        self.cond.notify()
        self.cond.wait()
           
        print self.getName() + ':是我'
        self.cond.notify()
        self.cond.wait()
           
        #这里是最后一段话,后面空白哥没接话了
所以说完就释放锁 结束线程
        print self.getName() + ':滚' 
        self.cond.release()
           
           
kongbai = kongbaige(cond, '   
'
)
ximi = ximige(cond, '西米')
#尼玛下面这2个启动标志是关键,虽然是空白哥先开的口,但是不能让他先启动,
#因为他先启动的可能直到发完notify通知了,西米哥才开始启动,
#西米哥启动后会一直处于44行的wait状态,因为空白哥已经发完notify通知了进入wait状态了,
#而西米哥没收到
#造成的结果就是2根线程就一直在那挂起,什么都不干,也不扯蛋了
ximi.start()
kongbai.start()
######运行结果######
    :一支穿云箭
西米:千军万马来相见
    :山无棱,天地合,乃敢与君绝!
西米:海可枯,石可烂,激情永不散!
    :紫薇!!!!(此处图片省略)
西米:尔康!!!(此处图片省略)
    :是你
西米:是我
    :有钱吗
借点
西米:滚

转自:http://zeping.blog.51cto.com/6140112/1258977

python多线程--theading模块的更多相关文章

  1. 再看python多线程------threading模块

    现在把关于多线程的能想到的需要注意的点记录一下: 关于threading模块: 1.关于 传参问题 如果调用的子线程函数需要传参,要在参数后面加一个“,”否则会抛参数异常的错误. 如下: for i ...

  2. Python(多线程threading模块)

    day27 参考:http://www.cnblogs.com/yuanchenqi/articles/5733873.html CPU像一本书,你不阅读的时候,你室友马上阅读,你准备阅读的时候,你室 ...

  3. Python中Queue模块及多线程使用

    Python的Queue模块提供一种适用于多线程编程的FIFO实现.它可用于在生产者(producer)和消费者(consumer)之间线程安全(thread-safe)地传递消息或其它数据,因此多个 ...

  4. python的_thread模块来实现多线程(<python核心编程例子>)

    python中_thread模块是一个低级别的多线程模块,它的问题在于主线程运行完毕后,会立马把子线程给结束掉,不加处理地使用_thread模块是不合适的.这里把书中讲述的有关_thread使用的例子 ...

  5. python 多线程,tthread模块比较底层,而threading模块是对thread做了一些包装,multithreading

    Python多线程详解 2016/05/10 · 基础知识 · 1 评论· 多线程 分享到:20 本文作者: 伯乐在线 - 王海波 .未经作者许可,禁止转载!欢迎加入伯乐在线 专栏作者. 1.多线程的 ...

  6. python多线程与threading模块

    python多线程与_thread模块 中介绍了线程的基本概念以及_thread模块的简单示例.然而,_thread模块过于简单,使得我们无法用它来准确地控制线程,本文介绍threading模块,它提 ...

  7. python多线程与_thread模块

    进程与线程 1.进程:计算机程序只是存储在磁盘中的可执行二进制(或其他类型)的文件.只有把他们加载到内存中并被操作系统调用,才具有其生命周期.进程则是一个执行中的程序.每个进程都拥有自己的地址空间,内 ...

  8. python多线程学习记录

    1.多线程的创建 import threading t = t.theading.Thread(target, args--) t.SetDeamon(True)//设置为守护进程 t.start() ...

  9. Python多线程多进程

    一.线程&进程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程, ...

随机推荐

  1. 线段树解决leetcode307. Range Sum Query - Mutable

    在下面的图中,求[0,0]和[1,1]区间元素和, 对于[0,0] start =0 ,end = 0, 查到root = 4 [0-1]的节点,mid = 0, 此时mid > end-1,表 ...

  2. php 编程效率(3)

    提高php编程效率的53个小知识点:用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中 搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当 ...

  3. 运算程序,计算玩判断,Y继续,重复计算,N结束

    #include "stdio.h" void main() { /*定义变量,d1,d2:第一.二个数 fu:符号 p1:接收判断号Y/N p2:接收的p1赋给p1 */ int ...

  4. Lucene全文检索技术

    Lucene全文检索技术 今日大纲 ●    搜索的概念.搜索引擎原理.倒排索引 ●    全文索引的概念 ●    使用Lucene对索引进行CRUD操作 ●    Lucene常用API详解 ●  ...

  5. iOS开发中怎么样使用激光推送

    1.注册激光推送的账号 ----> 创建应用 2.上传推送测试和发布的p12文件  注意密码的填写 3.下载sdk并拖进工程里 4.在build setting 搜索search   把路径改一 ...

  6. 全球互联网技术大会GITC 2016 最炫酷技术盛宴

    2016年对于全球互联网产业来说,可谓是不折不扣的"创新爆发年",科技创新的更迭速度和多元化趋势都呈现出全所未见的增长态势.我们看到,云计算.大数据等在多年前萌发的技术创新正在快速 ...

  7. 《JS权威指南学习总结--6.8对象的三个属性》

    内容要点: 每一个对象都有与之相关的原型(prototype).类(class)和可扩展性 一.原型属性 1.对象的原型属性是用来继承属性的,这个属性是如此重要,以至于我们经常把 "0的原型 ...

  8. POJ 1922 Ride to School#贪心

    (- ̄▽ ̄)-* //C跟着a君骑,然后更快的b君来了,C又跟着b君骑, //接着最快的d君来了,C就去跟着d君了, //最后最快的d君到达目的地时,C也就到了 //所以C的到达时间,就是最早到达的那 ...

  9. idea 切换新项目 新窗口 原窗口

    选择 file--setting. 在新打开的窗口中选择 Appearance & Behavior--System Settings 点 Confirm window to open pro ...

  10. Openjudge-计算概论(A)-鸡尾酒疗法

    描述: 鸡尾酒疗法,原指“高效抗逆转录病毒治疗”(HAART),由美籍华裔科学家何大一于1996年提出,是通过三种或三种以上的抗病毒药物联合使用来治疗艾 滋病.该疗法的应用可以减少单一用药产生的抗药性 ...