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 相关文章推荐
Django中更新多个对象数据与删除对象的方法
Jul 17 Python
Python中subprocess的简单使用示例
Jul 28 Python
django缓存配置的几种方法详解
Jul 16 Python
详解Python 函数如何重载?
Apr 23 Python
Django中的cookie和session
Aug 27 Python
pytorch中的transforms模块实例详解
Dec 31 Python
解决Python import docx出错DLL load failed的问题
Feb 13 Python
Pygame的程序开始示例代码
May 07 Python
Django通过json格式收集主机信息
May 29 Python
基于Keras的格式化输出Loss实现方式
Jun 17 Python
详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据
Dec 13 Python
Python-OpenCV实现图像缺陷检测的实例
Jun 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
PHP 生成的XML以FLASH获取为乱码终极解决
2009/08/07 PHP
php通过array_merge()函数合并两个数组的方法
2015/03/18 PHP
php文件包含目录配置open_basedir的使用与性能详解
2017/04/03 PHP
php curl操作API接口类完整示例
2019/05/21 PHP
PHP并发场景的三种解决方案代码实例
2021/02/27 PHP
33个优秀的jQuery 教程分享(幻灯片、动画菜单)
2011/07/08 Javascript
JS中的public和private对象,即static修饰符
2012/01/18 Javascript
JS设置时间无效问题的解决办法
2017/02/18 Javascript
jquery动态赋值id与动态取id方法示例
2017/08/21 jQuery
读懂CommonJS的模块加载
2019/04/19 Javascript
vue+导航锚点联动-滚动监听和点击平滑滚动跳转实例
2019/11/13 Javascript
微信小程序实现组件顶端固定或底端固定效果(不随滚动而滚动)
2020/04/09 Javascript
Javascript新手入门之字符串拼接与变量的应用
2020/12/03 Javascript
详解C++编程中一元运算符的重载
2016/01/19 Python
在cmder下安装ipython以及环境的搭建
2018/10/19 Python
pygame实现雷电游戏雏形开发
2018/11/20 Python
Django REST framework内置路由用法
2019/07/26 Python
pytorch实现mnist分类的示例讲解
2020/01/10 Python
python读写文件write和flush的实现方式
2020/02/21 Python
Python读取VOC中的xml目标框实例
2020/03/10 Python
python 如何使用find和find_all爬虫、找文本的实现
2020/10/16 Python
Html5新标签datalist实现输入框与后台数据库数据的动态匹配
2017/05/18 HTML / CSS
HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码
2020/04/10 HTML / CSS
红色康乃馨酒店:Red Carnation Hotels
2017/06/22 全球购物
美国非常受欢迎的Spa品牌:Bliss必列斯
2018/04/10 全球购物
加拿大的标志性百货公司:Hudson’s Bay(哈得逊湾)
2019/09/03 全球购物
德国苹果商店:MacTrade
2020/05/18 全球购物
Vector, ArrayList, HashTable, HashMap哪些是线程安全的,哪些不是
2015/10/12 面试题
食品行业求职人的自我评价
2014/01/19 职场文书
上课说话检讨书大全
2014/01/22 职场文书
2014年会策划方案
2014/05/11 职场文书
大二学生学年自我鉴定
2014/09/12 职场文书
居委会个人对照检查材料思想汇报
2014/09/29 职场文书
幼儿教师师德师风自我评价
2015/03/05 职场文书
房屋产权证明书
2015/06/19 职场文书
2019思想汇报范文
2019/05/21 职场文书