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 相关文章推荐
使用Node.js和Socket.IO扩展Django的实时处理功能
Apr 20 Python
Python实现Smtplib发送带有各种附件的邮件实例
Jun 05 Python
Python多进程multiprocessing.Pool类详解
Apr 27 Python
解决Pycharm无法import自己安装的第三方module问题
May 18 Python
对python中的 os.mkdir和os.mkdirs详解
Oct 16 Python
pandas DataFrame索引行列的实现
Jun 04 Python
Python使用循环神经网络解决文本分类问题的方法详解
Jan 16 Python
Python操作dict时避免出现KeyError的几种解决方法
Sep 20 Python
python IP地址转整数
Nov 20 Python
python 爬取百度文库并下载(免费文章限定)
Dec 04 Python
python实现经典排序算法的示例代码
Feb 07 Python
python 第三方库paramiko的常用方式
Feb 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
基础的WordPress插件制作教程
2015/11/24 PHP
如何判断微信内置浏览器(通过User Agent实现)
2014/09/01 Javascript
jquery单选框radio绑定click事件实现方法
2015/01/14 Javascript
jQuery过滤选择器用法示例
2016/09/12 Javascript
js判断请求的url是否可访问,支持跨域判断的实现方法
2016/09/17 Javascript
说说AngularJS中的$parse和$eval的用法
2017/09/14 Javascript
微信小程序实现蒙版弹窗效果
2018/11/01 Javascript
创建echart多个联动的示例代码
2018/11/23 Javascript
layui当点击文本框时弹出选择框,显示选择内容的例子
2019/09/02 Javascript
Vue实现附件上传功能
2020/05/28 Javascript
浅谈vue项目利用Hbuilder打包成APP流程,以及遇到的坑
2020/09/12 Javascript
python 解析html之BeautifulSoup
2009/07/07 Python
python选择排序算法的实现代码
2013/11/21 Python
用python写asp详细讲解
2013/12/16 Python
python抓取网页图片示例(python爬虫)
2014/04/27 Python
对pycharm 修改程序运行所需内存详解
2018/12/03 Python
python实现windows倒计时锁屏功能
2019/07/30 Python
Pytorch实现各种2d卷积示例
2019/12/30 Python
解决pyCharm中 module 调用失败的问题
2020/02/12 Python
Python scrapy爬取小说代码案例详解
2020/07/09 Python
瑞贝卡·明可弗包包官网:Rebecca Minkoff
2016/07/21 全球购物
德尔福集团DELPHI的笔试题
2012/02/22 面试题
汉语专业应届生求职信
2013/10/01 职场文书
博士生入学考试推荐信
2013/11/17 职场文书
餐饮业会计岗位职责
2013/12/19 职场文书
小学运动会广播稿200字(十二篇)
2014/01/14 职场文书
学习三严三实对照检查材料思想汇报
2014/09/22 职场文书
交通事故赔偿协议书
2014/10/16 职场文书
学校政风行风整改方案
2014/10/25 职场文书
2014年药剂科工作总结
2014/11/26 职场文书
布达拉宫导游词
2015/02/02 职场文书
警示教育片观后感
2015/06/17 职场文书
二胎满月酒致辞
2015/07/29 职场文书
公安干警正风肃纪心得体会
2016/01/15 职场文书
《刷子李》教学反思
2016/02/20 职场文书
Apache Kafka 分区重分配的实现原理解析
2022/07/15 Servers