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 接口_从协议到抽象基类详解
Aug 24 Python
详解python的sorted函数对字典按key排序和按value排序
Aug 10 Python
浅谈python 导入模块和解决文件句柄找不到问题
Dec 15 Python
pandas通过字典生成dataframe的方法步骤
Jul 23 Python
pyenv与virtualenv安装实现python多版本多项目管理
Aug 17 Python
PyTorch的Optimizer训练工具的实现
Aug 18 Python
tensorflow -gpu安装方法(不用自己装cuda,cdnn)
Jan 20 Python
Python常用编译器原理及特点解析
Mar 23 Python
利用python控制Autocad:pyautocad方式
Jun 01 Python
keras用auc做metrics以及早停实例
Jul 02 Python
零基础学python应该从哪里入手
Aug 11 Python
Python urlopen()参数代码示例解析
Dec 10 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线性表顺序存储实现代码(增删查改)
2012/02/16 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
2013/01/11 PHP
WIN8.1下搭建PHP5.6环境
2015/04/29 PHP
PHP处理会话函数大总结
2015/08/05 PHP
PHP二进制与字符串之间的相互转换教程
2016/10/14 PHP
javascript 写的一个简单的timer
2009/07/30 Javascript
Jquery 自定义动画概述及示例
2013/03/29 Javascript
node.js中的fs.fstatSync方法使用说明
2014/12/15 Javascript
用js代码和插件实现wordpress雪花飘落效果的四种方法
2014/12/15 Javascript
JS的数组迭代方法
2015/02/05 Javascript
jQuery遮罩层实现方法实例详解(附遮罩层插件)
2015/12/08 Javascript
SpringMVC返回json数据的三种方式
2015/12/10 Javascript
一款简单的jQuery图片标注效果附源码下载
2016/03/22 Javascript
javascript实现滑动解锁功能
2017/03/22 Javascript
详解react-router如何实现按需加载
2017/06/15 Javascript
深入探究node之Transform
2017/07/20 Javascript
vue组件父与子通信详解(一)
2017/11/07 Javascript
利用百度echarts实现图表功能简单入门示例【附源码下载】
2019/06/10 Javascript
简单使用webpack打包文件的实现
2019/10/29 Javascript
vue基础知识--axios合并请求和slot
2020/06/04 Javascript
如何在微信小程序中使用骨架屏的步骤
2020/06/12 Javascript
在Angular项目使用socket.io实现通信的方法
2021/01/05 Javascript
python分析nignx访问日志脚本分享
2015/02/26 Python
pyqt5对用qt designer设计的窗体实现弹出子窗口的示例
2019/06/19 Python
django有哪些好处和优点
2020/09/01 Python
如何选择使用结构还是类
2014/05/30 面试题
用Python写一个for循环的例子
2016/07/19 面试题
主管会计岗位责任制
2014/02/10 职场文书
应届生找工作求职信
2014/06/24 职场文书
校本教研活动总结
2014/07/01 职场文书
幼儿园教师节演讲稿
2014/09/03 职场文书
2015年大学班主任工作总结
2015/04/30 职场文书
班主任工作经验交流会总结
2015/11/02 职场文书
解决MySQL存储时间出现不一致的问题
2021/04/28 MySQL
使用这 6个Vue加载动画库来减少我们网站的跳出率
2021/05/18 Vue.js
Winsows11性能如何? win11性能测评多核竟比Win10差了10%
2021/11/21 数码科技