详解Python 模拟实现生产者消费者模式的实例


Posted in Python onAugust 10, 2017

详解Python 模拟实现生产者消费者模式的实例

散仙使用python3.4模拟实现的一个生产者与消费者的例子,用到的知识有线程,队列,循环等,源码如下:

Python代码

import queue 
import time 
import threading 
import random 
 
 
q=queue.Queue(5) 
 
#生产者 
def pr(): 
  name=threading.current_thread().getName() 
  print(name+"线程启动......") 
  for i in range(100): 
    t=random.randint(2,9) 
    print(name,"睡眠时间: ",t) 
    time.sleep(t); 
    d="A"+str(i) 
    print(name+"正在存第",i+1,"个数据: ",d) 
    #q.put("A"+str(i),False,2000) 
    q.put(d) 
  print("生产完毕!") 
 
 
#消费者 
def co(): 
  name=threading.current_thread().getName() 
  time.sleep(1) 
  print(name+"线程启动......") 
 
  while True: 
    print(name+"检测到队列数量: ",q.qsize()) 
    t=random.randint(2,9) 
    print(name,"睡眠时间: ",t) 
    data=q.get(); 
    print(name+"消费一个数据: ",data) 
 
 
 
 
p=threading.Thread(target=pr,name="生产者") 
c=threading.Thread(target=co,name="消费者1") 
c2=threading.Thread(target=co,name="消费者2") 
 
p.start() 
c.start() 
c2.start()

在本例里面散仙启动了1个生产者线程,2个消费者线程,打印效果如下:

Python代码 

生产者线程启动...... 
生产者 睡眠时间: 4 
消费者1线程启动...... 
消费者1检测到队列数量: 0 
消费者1 睡眠时间: 2 
消费者2线程启动...... 
消费者2检测到队列数量: 0 
消费者2 睡眠时间: 3 
生产者正在存第 1 个数据: A0 
生产者 睡眠时间: 9 
消费者1消费一个数据: A0 
消费者1检测到队列数量: 0 
消费者1 睡眠时间: 8 
生产者正在存第 2 个数据: A1 
生产者 睡眠时间: 5 
消费者2消费一个数据: A1 
消费者2检测到队列数量: 0 
消费者2 睡眠时间: 7 
生产者正在存第 3 个数据: A2 
生产者 睡眠时间: 8 
消费者1消费一个数据: A2 
消费者1检测到队列数量: 0 
消费者1 睡眠时间: 2 
生产者正在存第 4 个数据: A3 
生产者 睡眠时间: 7 
消费者2消费一个数据: A3 
消费者2检测到队列数量: 0 
消费者2 睡眠时间: 9 
生产者正在存第 5 个数据: A4 
生产者 睡眠时间: 2 
消费者1消费一个数据: A4 
消费者1检测到队列数量: 0 
消费者1 睡眠时间: 5 
生产者正在存第 6 个数据: A5 
生产者 睡眠时间: 5 
消费者2消费一个数据: A5 
消费者2检测到队列数量: 0 
消费者2 睡眠时间: 6 
生产者正在存第 7 个数据: A6 
生产者 睡眠时间: 7 
消费者1消费一个数据: A6 
消费者1检测到队列数量: 0 
消费者1 睡眠时间: 7 
生产者正在存第 8 个数据: A7 
生产者 睡眠时间: 3 
消费者2消费一个数据: A7 
消费者2检测到队列数量: 0 
消费者2 睡眠时间: 8 
生产者正在存第 9 个数据: A8 
生产者 睡眠时间: 2 
消费者1消费一个数据: A8 
消费者1检测到队列数量: 0 
消费者1 睡眠时间: 4 
生产者正在存第 10 个数据: A9 
生产者 睡眠时间: 4 
消费者2消费一个数据: A9 
消费者2检测到队列数量: 0 
消费者2 睡眠时间: 5 
生产者正在存第 11 个数据: A10 
生产者 睡眠时间: 2 
消费者1消费一个数据: A10 
消费者1检测到队列数量: 0 
消费者1 睡眠时间: 3 
生产者正在存第 12 个数据: A11 
生产者 睡眠时间: 3 
消费者2消费一个数据: A11 
消费者2检测到队列数量: 0 
消费者2 睡眠时间: 3 
生产者正在存第 13 个数据: A12 
生产者 睡眠时间: 3 
消费者1消费一个数据: A12 
消费者1检测到队列数量: 0 
消费者1 睡眠时间: 3 
生产者正在存第 14 个数据: A13 
生产者 睡眠时间: 8 
消费者2消费一个数据: A13 
消费者2检测到队列数量: 0 
消费者2 睡眠时间: 7 
生产者正在存第 15 个数据: A14 
生产者 睡眠时间: 3 
消费者1消费一个数据: A14 
消费者1检测到队列数量: 0 
消费者1 睡眠时间: 7 
生产者正在存第 16 个数据: A15 
生产者 睡眠时间: 2 
消费者2消费一个数据: A15 
消费者2检测到队列数量: 0 
消费者2 睡眠时间: 9

从这个例子中,我们发现利用队列,来做同步时非常简单方便的,除此之外队列,还有如下几个方便的方法:

介绍一下此包中的常用方法:   

Queue.qsize() 返回队列的大小  
Queue.empty() 如果队列为空,返回True,反之False  
Queue.full() 如果队列满了,返回True,反之False 
Queue.full 与 maxsize 大小对应  
Queue.get([block[, timeout]])获取队列,timeout等待时间  
Queue.get_nowait() 相当Queue.get(False) 
非阻塞 Queue.put(item) 写入队列,timeout等待时间  
Queue.put_nowait(item) 相当Queue.put(item, False) 
Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号 
Queue.join() 实际上意味着等到队列为空,再执行别的操作

以上就是详解Python 模拟实现生产者消费者模式的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
Python re模块介绍
Nov 30 Python
python 网络爬虫初级实现代码
Feb 27 Python
Python函数中的函数(闭包)用法实例
Mar 15 Python
Tensorflow卷积神经网络实例进阶
May 24 Python
python使用rpc框架gRPC的方法
Aug 24 Python
使用pandas读取文件的实现
Jul 31 Python
使用Python实现正态分布、正态分布采样
Nov 20 Python
使用python 将图片复制到系统剪贴中
Dec 13 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
Mar 14 Python
基于Python实现下载网易音乐代码实例
Aug 10 Python
利用Python发送邮件或发带附件的邮件
Nov 12 Python
Elasticsearch 基本查询和组合查询
Apr 19 Python
Python 操作文件的基本方法总结
Aug 10 #Python
Python 模拟登陆的两种实现方法
Aug 10 #Python
Python 网页解析HTMLParse的实例详解
Aug 10 #Python
关于Python中浮点数精度处理的技巧总结
Aug 10 #Python
Python 处理数据的实例详解
Aug 10 #Python
Python 由字符串函数名得到对应的函数(实例讲解)
Aug 10 #Python
关于Python中空格字符串处理的技巧总结
Aug 10 #Python
You might like
检测png图片是否完整的php代码
2010/09/06 PHP
PHP原生模板引擎 最简单的模板引擎
2012/04/25 PHP
PHP Curl出现403错误的解决办法
2014/05/29 PHP
PHP实现Soap通讯的方法
2014/11/03 PHP
php比较两个字符串长度的方法
2015/07/13 PHP
PHP实现批量清空删除指定文件夹所有内容的方法
2017/05/30 PHP
php根据命令行参数生成配置文件详解
2019/03/15 PHP
PHP7 windows支持
2021/03/09 PHP
JS BASE64编码 window.atob(), window.btoa()
2021/03/09 Javascript
半角全角相互转换的js函数
2009/10/16 Javascript
基于jquery的合并table相同单元格的插件(精简版)
2011/04/05 Javascript
jquery live()重复绑定的解决方法介绍
2014/01/03 Javascript
JavaScript跨域方法汇总
2014/10/16 Javascript
在JavaScript中使用对数Math.log()方法的教程
2015/06/15 Javascript
bootstrap基本配置_动力节点Java学院整理
2017/07/14 Javascript
初探js和简单隐藏效果的实例
2017/11/23 Javascript
vue基于两个计算属性实现选中和全选功能示例
2019/02/08 Javascript
JavaScript中this用法学习笔记
2019/03/17 Javascript
[04:22]DSPL第二期精彩集锦:残血反杀!
2014/12/10 DOTA
[48:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 VG vs KG
2018/03/31 DOTA
[02:01]2018完美盛典-开场舞《双子星》
2018/12/16 DOTA
python实现堆栈与队列的方法
2015/01/15 Python
pytorch 调整某一维度数据顺序的方法
2018/12/08 Python
Python3.6.x中内置函数总结及讲解
2019/02/22 Python
Flask-WTF表单的使用方法
2019/07/12 Python
Django在pycharm下修改默认启动端口的方法
2019/07/26 Python
详解如何使用CSS3中的结构伪类选择器和伪元素选择器
2020/01/06 HTML / CSS
CSS3 实现图形下落动画效果
2020/11/13 HTML / CSS
Puccini乌克兰:购买行李箱、女士手袋网上商店
2020/08/06 全球购物
Internal修饰符有什么含义
2013/07/10 面试题
质检员岗位职责
2013/12/17 职场文书
cf收人广告词
2014/03/14 职场文书
民事授权委托书范文
2014/08/02 职场文书
2015年办公室文秘工作总结
2015/04/30 职场文书
教师节老师寄语
2015/05/28 职场文书
记一次Mysql不走日期字段索引的原因小结
2021/10/24 MySQL