python条件变量之生产者与消费者操作实例分析


Posted in Python onMarch 22, 2017

本文实例讲述了python条件变量之生产者与消费者操作。分享给大家供大家参考,具体如下:

互斥锁是最简单的线程同步机制,面对复杂线程同步问题,Python还提供了Condition对象。Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还提供了wait和notify方法。线程首先acquire一个条件变量,然后判断一些条件。如果条件不满足则wait;如果条件满足,进行一些处理改变条件后,通过notify方法通知其他线程,其他处于wait状态的线程接到通知后会重新判断条件。不断的重复这一过程,从而解决复杂的同步问题。

可以认为Condition对象维护了一个锁(Lock/RLock)和一个waiting池。线程通过acquire获得Condition对象,当调用wait方法时,线程会释放Condition内部的锁并进入blocked状态,(但实际上不会block当前线程)同时在waiting池中记录这个线程。当调用notify方法时,Condition对象会从waiting池中挑选一个线程,通知其调用acquire方法尝试取到锁。

Condition对象的构造函数可以接受一个Lock/RLock对象作为参数,如果没有指定,则Condition对象会在内部自行创建一个RLock。

线程同步经典问题----生产者与消费者问题可以使用条件变量轻松解决。

import threading
import time
class Producer(threading.Thread):
  def __init__(self):
    threading.Thread.__init__(self)
  def run(self):
    global count
    while True:
      con.acquire()
      if count <20:
        count += 1
        print self.name," Producer product 1,current is %d" %(count)
        con.notify()
      else:
        print self.name,"Producer say box is full"
        con.wait()
      con.release()
      time.sleep(1)
class Consumer(threading.Thread):
  def __init__(self):
    threading.Thread.__init__(self)
  def run(self):
    global count
    while True:
      con.acquire()
      if count>4:
        count -=4
        print self.name,"Consumer consume 4,current is %d" %(count)
        con.notify()
      else:
        con.wait()
        print self.name," Consumer say box is empty"
      con.release()
      time.sleep(1)
count = 0
con = threading.Condition()
def test():
  for i in range(1):
    a = Consumer()
    a.start()
  for i in range(1):
    b =Producer()
    b.start()
if __name__=='__main__':
  test()

上面的代码假定消费者消费的比较快,输出结果为:

python条件变量之生产者与消费者操作实例分析

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
浅谈django开发者模式中的autoreload是如何实现的
Aug 18 Python
python中使用PIL制作并验证图片验证码
Mar 15 Python
python opencv3实现人脸识别(windows)
May 25 Python
python实现从本地摄像头和网络摄像头截取图片功能
Jul 11 Python
详解使用python绘制混淆矩阵(confusion_matrix)
Jul 14 Python
Django发送邮件功能实例详解
Sep 02 Python
python构造函数init实例方法解析
Jan 19 Python
Pytorch 使用不同版本的cuda的方法步骤
Apr 02 Python
Pytest框架之fixture的详细使用教程
Apr 07 Python
Python的logging模块基本用法
Dec 24 Python
Python爬虫实现selenium处理iframe作用域问题
Jan 27 Python
python基础之while循环语句的使用
Apr 20 Python
Python实现遍历目录的方法【测试可用】
Mar 22 #Python
Python简单操作sqlite3的方法示例
Mar 22 #Python
Python创建xml文件示例
Mar 22 #Python
用Python将IP地址在整型和字符串之间轻松转换
Mar 22 #Python
用python写一个windows下的定时关机脚本(推荐)
Mar 21 #Python
利用Python实现Windows定时关机功能
Mar 21 #Python
使用Python生成XML的方法实例
Mar 21 #Python
You might like
PHP实现把文本中的URL转换为链接的auolink()函数分享
2014/07/29 PHP
PHP仿微信发红包领红包效果
2016/10/30 PHP
浅谈Laravel中的三种中间件的作用
2019/10/13 PHP
用JavaScript页面不刷新时全选择,全删除(GridView)
2009/04/14 Javascript
用JQuery调用Session的实现代码
2010/10/29 Javascript
无刷新预览所选择的图片示例代码
2014/04/02 Javascript
JavaScript使用shift方法移除素组第一个元素实例分析
2015/04/06 Javascript
AngularJS中scope的绑定策略实例分析
2017/10/30 Javascript
使用js在layui中实现上传图片压缩
2019/06/18 Javascript
Layui table field初始化加载时进行隐藏的方法
2019/09/19 Javascript
js实现金山打字通小游戏
2020/07/24 Javascript
原生JS实现拖拽功能
2020/12/16 Javascript
Python Web框架Flask中使用百度云存储BCS实例
2015/02/08 Python
使用rst2pdf实现将sphinx生成PDF
2016/06/07 Python
使用requests库制作Python爬虫
2018/03/25 Python
python读取Excel表格文件的方法
2019/09/02 Python
Python中if有多个条件处理方法
2020/02/26 Python
python 穷举指定长度的密码例子
2020/04/02 Python
简单了解python列表和元组的区别
2020/05/14 Python
Python使用shutil模块实现文件拷贝
2020/07/31 Python
python 获取字典键值对的实现
2020/11/12 Python
Nike爱尔兰官方网站:Nike.com (IE)
2018/03/12 全球购物
FragranceNet中文网:北美健康美容线上零售商
2020/08/26 全球购物
SQL Server面试题
2016/10/17 面试题
普师专业个人自荐信范文
2013/11/26 职场文书
餐饮商业计划书范文
2014/04/29 职场文书
六一亲子活动总结
2014/07/01 职场文书
2014学生会工作总结报告
2014/12/02 职场文书
2015年教研组工作总结
2015/05/04 职场文书
2015年秋季小学开学典礼主持词
2015/07/16 职场文书
团委副书记工作总结
2015/08/14 职场文书
2015年党务工作者个人工作总结
2015/10/22 职场文书
2016新教师岗前培训心得体会
2016/01/08 职场文书
参观监狱警示教育心得体会
2016/01/15 职场文书
go语言map与string的相互转换的实现
2021/04/07 Golang
winserver2019安装软件一直卡在应用程序正在为首次使用做准备
2022/06/10 Servers