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翻译软件实现代码(使用google api完成)
Nov 26 Python
Python 字符串操作方法大全
Mar 11 Python
零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版
Nov 06 Python
Python出现segfault错误解决方法
Apr 16 Python
使用python存储网页上的图片实例
May 22 Python
Python利用递归实现文件的复制方法
Oct 27 Python
python使用pymongo操作mongo的完整步骤
Apr 13 Python
Python使用eval函数执行动态标表达式过程详解
Oct 17 Python
详解pycharm连接远程linux服务器的虚拟环境的方法
Nov 13 Python
基于Python中Remove函数的用法讨论
Dec 11 Python
matplotlib交互式数据光标mpldatacursor的实现
Feb 03 Python
Python 一键获取电脑浏览器的账号密码
May 11 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
joomla jce editor 解决上传中文名文件失败问题
2013/06/09 PHP
自己写了一个php检测文件编码的函数
2014/04/21 PHP
PHP安装threads多线程扩展基础教程
2015/11/17 PHP
PHP7下协程的实现方法详解
2017/12/17 PHP
thinkphp5框架实现数据库读取的数据转换成json格式示例
2019/10/10 PHP
javascript学习随笔(使用window和frame)的技巧
2007/03/08 Javascript
js写一个字符串转成驼峰的实例
2013/06/21 Javascript
用jquery统计子菜单的条数示例代码
2013/10/18 Javascript
jQuery设置Easyui校验规则(推荐)
2016/11/21 Javascript
Bootstrap文件上传组件之bootstrap fileinput
2016/11/25 Javascript
js实现tab选项卡切换功能
2017/01/13 Javascript
js实现简易聊天对话框
2017/08/17 Javascript
当vue路由变化时,改变导航栏的样式方法
2018/08/22 Javascript
解决vue的变量在settimeout内部效果失效的问题
2018/08/30 Javascript
微信小程序利用Canvas绘制图片和竖排文字详解
2019/06/25 Javascript
vue不操作dom实现图片轮播的示例代码
2019/12/18 Javascript
iSlider手机端图片滑动切换插件使用详解
2019/12/24 Javascript
探索node之事件循环的实现
2020/10/30 Javascript
Python进阶之@property动态属性的实现
2019/04/01 Python
Django 多对多字段的更新和插入数据实例
2020/03/31 Python
Html5页面点击遮罩层背景关闭遮罩层
2020/11/30 HTML / CSS
LightInTheBox西班牙站点:全球商品在线采购
2016/09/22 全球购物
美国男士西装打折店:Jos. A. Bank
2017/11/13 全球购物
英国休闲奢华的缩影:Crew Clothing
2019/05/05 全球购物
Book Depository美国:全球领先的专业网上书店之一
2019/08/14 全球购物
俄罗斯品牌服装和鞋子在线商店:BRIONITY
2020/03/26 全球购物
介绍一下RMI的基本概念
2016/12/17 面试题
项目总经理岗位职责
2014/02/14 职场文书
总账会计岗位职责
2014/03/13 职场文书
公司新年寄语
2014/04/04 职场文书
幼儿园中班上学期评语
2014/04/18 职场文书
电子商务专业应届毕业生求职信
2014/06/21 职场文书
民族学专业职业生涯规划范文:积跬步以至千里
2014/09/11 职场文书
2014年纪检部工作总结
2014/11/12 职场文书
2014年依法行政工作总结
2014/11/19 职场文书
php去除deprecated的实例方法
2021/11/17 PHP