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中selenium实现文件上传所有方法整理总结
Apr 01 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
Apr 22 Python
Python实现基于KNN算法的笔迹识别功能详解
Jul 09 Python
python引用(import)某个模块提示没找到对应模块的解决方法
Jan 19 Python
Python 函数返回值的示例代码
Mar 11 Python
python之pyqt5通过按钮改变Label的背景颜色方法
Jun 13 Python
Python数学形态学实例分析
Sep 06 Python
超全Python图像处理讲解(多模块实现)
Apr 13 Python
python百行代码自制电脑端网速悬浮窗的实现
May 12 Python
django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
May 19 Python
Python使用requests模块爬取百度翻译
Aug 25 Python
Python djanjo之csrf防跨站攻击实验过程
May 14 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制作的意见反馈表源码
2007/03/11 PHP
关于php内存不够用的快速解决方法
2013/10/26 PHP
使用composer 安装 laravel框架的方法图文详解
2019/08/02 PHP
详解PHP中curl_multi并发的实现
2020/06/08 PHP
javascript下function声明一些小结
2007/12/28 Javascript
兼容IE和Firefox的javascript获取iframe文档内容的函数
2011/08/15 Javascript
easyui datagrid 键盘上下控制选中行示例
2014/03/31 Javascript
javaScript如何处理从java后台返回的list
2014/04/24 Javascript
JS网页在线获取鼠标坐标值的方法
2015/02/28 Javascript
JS实现向表格行添加新单元格的方法
2015/03/30 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
2015/11/06 Javascript
javascript实现表单验证
2016/01/29 Javascript
动态加载js、css的简单实现代码
2016/05/26 Javascript
Bootstrap 填充Json数据的实例代码
2017/01/11 Javascript
nodejs基础知识
2017/02/03 NodeJs
node.js入门教程之querystring模块的使用方法
2017/02/27 Javascript
bootstrap表单按回车会自动刷新页面的解决办法
2017/03/08 Javascript
关于echarts在节点显示动态数据及添加提示文本所遇到的问题
2018/04/20 Javascript
解决layer.open后laydate失效的问题
2019/09/06 Javascript
解决vue初始化项目时,一直卡在Project description上的问题
2019/10/31 Javascript
Vue学习笔记之计算属性与侦听器用法
2019/12/07 Javascript
js仿360开机效果
2019/12/26 Javascript
跟老齐学Python之赋值,简单也不简单
2014/09/24 Python
常见的在Python中实现单例模式的三种方法
2015/04/08 Python
python对html过滤处理的方法
2018/10/21 Python
python获取指定日期范围内的每一天,每个月,每季度的方法
2019/08/08 Python
python统计指定目录内文件的代码行数
2019/09/19 Python
Clarins娇韵诗美国官网:法国天然护肤品牌
2016/09/26 全球购物
存储过程和函数的区别
2013/05/28 面试题
土木工程毕业生推荐信
2013/10/28 职场文书
应用数学自荐书范文
2013/11/24 职场文书
企业安全生产演讲稿
2014/05/09 职场文书
个性车贴标语
2014/06/24 职场文书
安全生产一岗双责责任书
2014/07/28 职场文书
Python基础之常用库常用方法整理
2021/04/30 Python
Redis 哨兵机制及配置实现
2022/03/25 Redis