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获取本地计算机名字的方法
Apr 29 Python
python计算文本文件行数的方法
Jul 06 Python
探究python中open函数的使用
Mar 01 Python
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
Aug 18 Python
使用memory_profiler监测python代码运行时内存消耗方法
Dec 03 Python
python http基本验证方法
Dec 26 Python
python游戏开发之视频转彩色字符动画
Apr 26 Python
解决Python设置函数调用超时,进程卡住的问题
Aug 08 Python
opencv3/C++实现视频读取、视频写入
Dec 11 Python
python支持多线程的爬虫实例
Dec 21 Python
详解vscode实现远程linux服务器上Python开发
Nov 10 Python
Pyhton模块和包相关知识总结
May 12 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
2019年中国咖啡业现状与发展趋势
2021/03/04 咖啡文化
如何跨站抓取别的站点的页面的补充
2006/10/09 PHP
PHP批量删除、清除UTF-8文件BOM头的代码实例
2014/04/14 PHP
php建立Ftp连接的方法
2015/03/07 PHP
PHP的伪随机数与真随机数详解
2015/05/27 PHP
PHP的mysqli_sqlstate()函数讲解
2019/01/23 PHP
jQuery.Validate 使用笔记(jQuery Validation范例 )
2010/06/25 Javascript
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
编写高性能Javascript代码的N条建议
2015/10/12 Javascript
jQuery移动端图片上传组件
2016/06/12 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单的实现代码
2016/06/23 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
2016/08/05 Javascript
微信小程序学习(4)-系统配置app.json详解
2017/01/12 Javascript
vue.js 1.x与2.0中js实时监听input值的变化
2017/03/15 Javascript
使用jquery datatable和bootsrap创建表格实例代码
2017/03/17 Javascript
原生javascript上传图片带进度条【实例分享】
2017/04/06 Javascript
JavaScript使用math.js进行精确计算操作示例
2018/06/19 Javascript
基于Vue实现电商SKU组合算法问题
2019/05/29 Javascript
弱类型语言javascript开发中的一些坑实例小结【变量、函数、数组、对象、作用域等】
2019/08/07 Javascript
基于vue-cli3+typescript的tsx开发模板搭建过程分享
2020/02/28 Javascript
Python 变量类型及命名规则介绍
2013/06/08 Python
程序员的七夕用30行代码让Python化身表白神器
2019/08/07 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
2019/10/23 Python
python3中sorted函数里cmp参数改变详解
2020/03/12 Python
查看keras各种网络结构各层的名字方式
2020/06/11 Python
Pytorch 高效使用GPU的操作
2020/06/27 Python
python实现马丁策略回测3000只股票的实例代码
2021/01/22 Python
仿CSDN Blog返回页面顶部功能实现原理及代码
2013/06/30 HTML / CSS
澳大利亚和新西兰最大的在线旅行社之一:Aunt Betty
2019/08/07 全球购物
2014学雷锋活动总结
2014/03/09 职场文书
买卖合同协议书范本
2014/10/18 职场文书
2014年纳税评估工作总结
2014/12/23 职场文书
给老婆的道歉信
2015/01/20 职场文书
新郎婚礼致辞
2015/07/27 职场文书
Pytest中skip skipif跳过用例详解
2021/06/30 Python
CSS巧用渐变实现高级感背景光动画
2021/12/06 HTML / CSS