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生成随机密码
Mar 10 Python
Python中二维列表如何获取子区域元素的组成
Jan 19 Python
python 对key为时间的dict排序方法
Oct 17 Python
python利用thrift服务读取hbase数据的方法
Dec 27 Python
简单了解python单例模式的几种写法
Jul 01 Python
python使用minimax算法实现五子棋
Jul 29 Python
Pandas操作CSV文件的读写实现方法
Nov 13 Python
在tensorflow中设置使用某一块GPU、多GPU、CPU的操作
Feb 07 Python
Python字符串函数strip()原理及用法详解
Jul 23 Python
基于Python爬取51cto博客页面信息过程解析
Aug 25 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
Sep 04 Python
Python 列表反转显示的四种方法
Nov 16 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 Ctemplate引擎开发相关内容
2012/03/03 PHP
解决PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题
2020/08/24 PHP
简单的JS多重继承示例
2008/03/13 Javascript
使用js获取QueryString的方法小结
2010/02/28 Javascript
JQuery对class属性的操作实现按钮开关效果
2013/10/11 Javascript
js中Image对象以及对其预加载处理示例
2013/11/20 Javascript
Javascript基础教程之数据类型转换
2015/01/18 Javascript
Node.js中child_process实现多进程
2015/02/03 Javascript
JavaScript中实现Map的示例代码
2015/09/09 Javascript
JQuery+Ajax实现数据查询、排序和分页功能
2015/09/27 Javascript
javascript中window.open在原来的窗口中打开新的窗口(不同名)
2015/11/15 Javascript
JavaScript基础教程——入门必看篇
2016/05/20 Javascript
jQuery弹出层插件popShow用法示例
2017/01/23 Javascript
JS操作input标签属性checkbox全选的实现代码
2017/03/02 Javascript
Vue 中可以定义组件模版的几种方式
2019/08/06 Javascript
利用Python实现命令行版的火车票查看器
2016/08/05 Python
pandas object格式转float64格式的方法
2018/04/10 Python
对python中执行DOS命令的3种方法总结
2018/05/12 Python
对python_discover方法遍历所有执行的用例详解
2019/02/13 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
2019/12/12 Python
基于Python3.7.1无法导入Numpy的解决方式
2020/03/09 Python
解决 jupyter notebook 回车换两行问题
2020/04/15 Python
python实现登录与注册系统
2020/11/30 Python
List, Set, Map是否继承自Collection接口?
2016/05/16 面试题
人事行政主管岗位职责
2013/12/22 职场文书
办理居住证介绍信
2014/01/15 职场文书
《春笋》教学反思
2014/04/15 职场文书
竞争与合作演讲稿
2014/05/12 职场文书
中秋节活动总结
2014/08/29 职场文书
停车位租赁协议书
2014/09/24 职场文书
工程承包协议书
2014/10/20 职场文书
出纳岗位职责范本
2015/03/31 职场文书
2015年酒店客房部工作总结
2015/04/25 职场文书
创业计划书之电动车企业
2019/10/11 职场文书
python实现黄金分割法的示例代码
2021/04/28 Python
Python图片验证码降噪和8邻域降噪
2021/08/30 Python