前言

当小伙伴a在往火锅里面添加鱼丸,这个就是生产者行为;另外一个小伙伴b在吃掉鱼丸就是消费者行为。当火锅里面鱼丸达到一定数量加满后b才能吃,这就是一种条件判断了。

这就是本篇要讲的Condition(条件变量)

Condition

Condition(条件变量)通常与一个锁关联。需要在多个Contidion中共享一个锁时,可以传递一个Lock/RLock实例给构造方法,否则它将自己生成一个RLock实例。

可以认为,除了Lock带有的锁定池外,Condition还包含一个等待池,池中的线程处于状态图中的等待阻塞状态,直到另一个线程调用notify()/notifyAll()通知;得到通知后线程进入锁定池等待锁定。

Condition():

  • acquire(): 线程锁
  • release(): 释放锁
  • wait(timeout): 线程挂起,直到收到一个notify通知或者超时(可选的,浮点数,单位是秒s)才会被唤醒继续运行。wait()必须在已获得Lock前提下才能调用,否则会触发RuntimeError。
  • notify(n=1): 通知其他线程,那些挂起的线程接到这个通知之后会开始运行,默认是通知一个正等待该condition的线程,最多则唤醒n个等待的线程。notify()必须在已获得Lock前提下才能调用,否则会触发RuntimeError。notify()不会主动释放Lock。
  • notifyAll(): 如果wait状态线程比较多,notifyAll的作用就是通知所有线程

生产者与消费者

实现场景:当a同学王火锅里面添加鱼丸加满后(最多5个,加满后通知b去吃掉),通知b同学去吃掉鱼丸(吃到0的时候通知a同学继续添加)

# coding=utf-8
import threading
import time con = threading.Condition() num = 0 # 生产者
class Producer(threading.Thread): def __init__(self):
threading.Thread.__init__(self) def run(self):
# 锁定线程
global num
con.acquire()
while True:
print "开始添加!!!"
num += 1
print "火锅里面鱼丸个数:%s" % str(num)
time.sleep(1)
if num >= 5:
print "火锅里面里面鱼丸数量已经到达5个,无法添加了!"
# 唤醒等待的线程
con.notify() # 唤醒小伙伴开吃啦
# 等待通知
con.wait()
# 释放锁
con.release() # 消费者
class Consumers(threading.Thread):
def __init__(self):
threading.Thread.__init__(self) def run(self):
con.acquire()
global num
while True:
print "开始吃啦!!!"
num -= 1
print "火锅里面剩余鱼丸数量:%s" %str(num)
time.sleep(2)
if num <= 0:
print "锅底没货了,赶紧加鱼丸吧!"
con.notify() # 唤醒其它线程
# 等待通知
con.wait()
con.release() p = Producer()
c = Consumers()
p.start()
c.start()

运行结果:

开始添加!!!

火锅里面鱼丸个数:1

开始添加!!!

火锅里面鱼丸个数:2

开始添加!!!

火锅里面鱼丸个数:3

开始添加!!!

火锅里面鱼丸个数:4

开始添加!!!

火锅里面鱼丸个数:5

火锅里面里面鱼丸数量已经到达5个,无法添加了!

开始吃啦!!!

火锅里面剩余鱼丸数量:4

开始吃啦!!!

火锅里面剩余鱼丸数量:3

开始吃啦!!!

火锅里面剩余鱼丸数量:2

开始吃啦!!!

火锅里面剩余鱼丸数量:1

开始吃啦!!!

火锅里面剩余鱼丸数量:0

锅底没货了,赶紧加鱼丸吧!

开始添加!!!

火锅里面鱼丸个数:1

开始添加!!!

火锅里面鱼丸个数:2

开始添加!!!

火锅里面鱼丸个数:3

开始添加!!!

火锅里面鱼丸个数:4

开始添加!!!

火锅里面鱼丸个数:5

python自动化交流 QQ群:779429633

最新文章

  1. C++模板元编程(C++ template metaprogramming)
  2. 网络--&gt;监控--&gt;单位换算
  3. 微信或移动端网页的meta
  4. BZOJ1588——[HNOI2002]营业额统计
  5. sublime3的licence(update 2016-04-14)
  6. H264相关代码
  7. Java中的字符串驻留(String Interning)
  8. Oracle查询笔记
  9. S2 深入.NET和C#编程 三:使用集合组织相关数据
  10. Linux常见压缩命令 - gzip,zcat,bzip2,bzcat
  11. CentOS7安装MySQL并允许远程登录
  12. 数组中&amp;a与&amp;a[0]的区别 转载自http://blog.csdn.net/FX677588/article/details/74857473
  13. websocket Tomcat JSP Demo
  14. 高性能迷你React框架anujs1.0.8发布
  15. Luogu P1525 关押罪犯
  16. CATEGORICAL, ORDINAL AND INTERVAL VARIABLES
  17. 如何在O(n)的时间复杂度内找出数组中出现次数超过了一半的数
  18. STL__网上资料
  19. cocoapods 安装过程及常见问题
  20. 5个界面效果很炫的JavaScript UI 框架

热门文章

  1. JAVA多线程提高十二:阻塞队列应用
  2. CSS Sprite笔记
  3. 49、是否使用过functools中的函数?其作用是什么?
  4. 避免无用的渲染绘制(Avoiding Unnecessary Paints)
  5. 深入理解Spring系列之四:BeanDefinition装载前奏曲
  6. perl6 登录phpmyadmin
  7. 浅谈iOS多线程
  8. 基于scrapy的分布式爬虫抓取新浪微博个人信息和微博内容存入MySQL
  9. HDU 6195 2017沈阳网络赛 公式
  10. caffe Python API 之可视化