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中实现两个字典(dict)合并的方法
Sep 23 Python
Python文档生成工具pydoc使用介绍
Jun 02 Python
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
Feb 21 Python
Python常见字典内建函数用法示例
May 14 Python
Python 调用 zabbix api的方法示例
Jan 06 Python
Python实现多进程的四种方式
Feb 22 Python
详解python:time模块用法
Mar 25 Python
python SQLAlchemy 中的Engine详解
Jul 04 Python
python 协程 gevent原理与用法分析
Nov 22 Python
python 使用opencv 把视频分割成图片示例
Dec 12 Python
linux环境下安装python虚拟环境及注意事项
Jan 07 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
May 15 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 仿Comsenz安装效果代码打包提供下载
2010/05/09 PHP
PHP性能优化工具篇Benchmark类调试执行时间
2011/12/06 PHP
PHP执行批量mysql语句的解决方法
2013/05/02 PHP
php获取文件大小的方法
2014/02/26 PHP
学习php设计模式 php实现原型模式(prototype)
2015/12/07 PHP
PHP文件上传之多文件上传的实现思路
2016/01/27 PHP
PHP MVC框架skymvc支持多文件上传
2016/05/26 PHP
网页javascript精华代码集
2007/01/24 Javascript
JavaScript中的16进制字符(改进)
2011/11/21 Javascript
javascript移出节点removeChild()使用介绍
2014/04/03 Javascript
简介JavaScript中setUTCSeconds()方法的使用
2015/06/12 Javascript
vue-router中scrollBehavior的巧妙用法
2018/07/09 Javascript
webpack file-loader和url-loader的区别
2019/01/15 Javascript
发布订阅模式在vue中的实际运用实例详解
2019/06/09 Javascript
[59:08]Ti4 冒泡赛第二天 NEWBEE vs Titan 2
2014/07/15 DOTA
[03:26]《DAC最前线》之EG经理自述DOTA2经历
2015/02/02 DOTA
Python中文分词实现方法(安装pymmseg)
2016/06/14 Python
python中安装模块包版本冲突问题的解决
2017/05/02 Python
如何用python整理附件
2018/05/13 Python
python 用lambda函数替换for循环的方法
2018/06/09 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
2019/01/03 Python
将matplotlib绘图嵌入pyqt的方法示例
2020/01/08 Python
python+OpenCV实现图像拼接
2020/03/05 Python
基于django 的orm中非主键自增的实现方式
2020/05/18 Python
深入解析HTML5 Canvas控制图形矩阵变换的方法
2016/03/24 HTML / CSS
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
PHP引擎php.ini参数优化深入讲解
2021/03/24 PHP
实用求职信范文分享
2013/12/25 职场文书
质检部职责
2013/12/28 职场文书
《黄山奇石》教学反思
2014/04/19 职场文书
小区的门卫岗位职责
2014/10/01 职场文书
立案决定书范文
2015/06/24 职场文书
小学生节约用水倡议书
2019/08/12 职场文书
基于Pygame实现简单的贪吃蛇游戏
2021/12/06 Python
MySQL视图概念以及相关应用
2022/04/19 MySQL
教你win10系统中APPCRASH事件问题解决方法
2022/07/15 数码科技