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 相关文章推荐
Python写的英文字符大小写转换代码示例
Mar 06 Python
Python实现豆瓣图片下载的方法
May 25 Python
Python while、for、生成器、列表推导等语句的执行效率测试
Jun 03 Python
python导入时小括号大作用
Jan 10 Python
Python爬虫爬取一个网页上的图片地址实例代码
Jan 16 Python
对Python中9种生成新对象的方法总结
May 23 Python
python清除函数占用的内存方法
Jun 25 Python
详解Python并发编程之创建多线程的几种方法
Aug 23 Python
使用pyshp包进行shapefile文件修改的例子
Dec 06 Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
Mar 16 Python
Python urlopen()参数代码示例解析
Dec 10 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
Jan 28 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版)
2006/10/09 PHP
PHP中的日期处理方法集锦
2007/01/02 PHP
修改php.ini实现Mysql导入数据库文件最大限制的修改方法
2007/12/11 PHP
php打造属于自己的MVC框架
2012/03/07 PHP
关于php正则匹配汉字的方法介绍
2013/04/25 PHP
php校验表单检测字段是否为空的方法
2015/03/20 PHP
PHP simplexml_load_file()函数讲解
2019/02/03 PHP
Prototype Date对象 学习
2009/07/12 Javascript
JavaScript实现拼音排序的方法
2012/11/20 Javascript
div模拟选择框示例代码
2013/11/03 Javascript
js根据鼠标移动速度背景图片自动旋转的方法
2015/02/28 Javascript
jQuery实现数秒后自动提交form的方法
2015/03/05 Javascript
浅谈js内置对象Math的属性和方法(推荐)
2016/09/19 Javascript
vue 请求后台数据的实例代码
2017/06/22 Javascript
JavaScript数组去重算法实例小结
2018/05/07 Javascript
JavaScript原型对象原理与应用分析
2018/12/27 Javascript
vue 实现模糊检索并根据其他字符的首字母顺序排列
2019/09/19 Javascript
vue使用openlayers实现移动点动画
2020/09/24 Javascript
python根据出生年份简单计算生肖的方法
2015/03/27 Python
解读Python中degrees()方法的使用
2015/05/18 Python
Python使用sort和class实现的多级排序功能示例
2018/08/15 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
2019/04/29 Python
Python3.5常见内置方法参数用法实例详解
2019/04/29 Python
python字符串和常用数据结构知识总结
2019/05/21 Python
购买瑞典当代设计的腕表和太阳眼镜:TRIWA
2016/10/30 全球购物
专注澳大利亚特产和新西兰特产的澳洲中文网:0061澳洲制造
2019/03/24 全球购物
Servlet面试题库
2015/07/18 面试题
医院办公室主任职责
2013/12/29 职场文书
十佳美德少年事迹材料
2014/02/05 职场文书
抽样调查项目计划书
2014/04/24 职场文书
2014副镇长民主生活会个人对照检查材料思想汇报
2014/09/30 职场文书
计算机专业自荐信
2015/03/05 职场文书
毕业生捐书活动倡议书
2015/04/27 职场文书
卫生院义诊活动总结
2015/05/07 职场文书
python图片灰度化处理的几种方法
2021/06/23 Python
vue项目打包后路由错误的解决方法
2022/04/13 Vue.js