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基于select实现的socket服务器
Apr 13 Python
python字典的常用操作方法小结
May 16 Python
python:socket传输大文件示例
Jan 18 Python
python-str,list,set间的转换实例
Jun 27 Python
对numpy中的where方法嵌套使用详解
Oct 31 Python
Python数据可视化库seaborn的使用总结
Jan 15 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
Jun 05 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
Jun 13 Python
python如何实现视频转代码视频
Jun 17 Python
Python搭建代理IP池实现存储IP的方法
Oct 27 Python
Python文件操作函数用法实例详解
Dec 24 Python
Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解
Mar 30 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如何将log信息写入服务器中的log文件
2015/07/29 PHP
php 从指定数字中获取随机组合的简单方法(推荐)
2017/04/05 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
php压缩文件夹最新版
2018/07/18 PHP
javascript取消文本选定的实现代码
2010/11/14 Javascript
使用js实现数据格式化
2014/12/03 Javascript
js实现键盘控制DIV移动的方法
2015/01/10 Javascript
Python脚本后台运行的几种方式
2015/03/09 Javascript
Bootstrapvalidator校验、校验清除重置的实现代码(推荐)
2016/09/28 Javascript
jQuery实现弹窗居中效果类似alert()
2017/02/27 Javascript
angularjs实现首页轮播图效果
2017/04/14 Javascript
Angular4表单验证代码详解
2017/09/03 Javascript
nodejs实现简单的gulp打包
2017/12/21 NodeJs
分享5个好用的javascript文件上传插件
2018/09/16 Javascript
layui table 列宽百分比显示的实现方法
2019/09/28 Javascript
Python实现豆瓣图片下载的方法
2015/05/25 Python
Python实时获取cmd的输出
2015/12/13 Python
在Python中调用Ping命令,批量IP的方法
2019/01/26 Python
Python SELENIUM上传文件或图片实现过程
2019/10/28 Python
pytorch 实现查看网络中的参数
2020/01/06 Python
日本最大化妆品和美容产品的综合口碑网站:cosme shopping
2019/08/28 全球购物
Servlet面试题库
2015/07/18 面试题
SOA面试题:如何在SOA中实现松耦合
2013/07/21 面试题
函授本科毕业生自我鉴定
2013/10/16 职场文书
会计自我鉴定
2013/11/02 职场文书
《油菜花开了》教学反思
2014/02/22 职场文书
工作经验交流材料
2014/12/30 职场文书
留学推荐信怎么写
2015/03/26 职场文书
2015年学生会干事工作总结
2015/04/09 职场文书
初中政教处工作总结
2015/08/12 职场文书
关于销售人员的年终工作总结要点
2019/08/15 职场文书
go语言map与string的相互转换的实现
2021/04/07 Golang
如何使用php生成zip压缩包
2021/04/21 PHP
基于CSS3画一个iPhone
2021/04/21 HTML / CSS
MySQL 四种连接和多表查询详解
2021/07/16 MySQL
mysql主从复制的实现步骤
2021/10/24 MySQL