详解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 相关文章推荐
浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)
Apr 10 Python
浅谈DataFrame和SparkSql取值误区
Jun 09 Python
selenium+python实现1688网站验证码图片的截取功能
Aug 14 Python
python使用udp实现聊天器功能
Dec 10 Python
利用python提取wav文件的mfcc方法
Jan 09 Python
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
Jul 22 Python
Python中函数的返回值示例浅析
Aug 28 Python
django中瀑布流写法实例代码
Oct 14 Python
Python如何使用BeautifulSoup爬取网页信息
Nov 26 Python
python隐藏类中属性的3种实现方法
Dec 19 Python
python 弧度与角度互转实例
Apr 15 Python
python+selenium+chrome实现淘宝购物车秒杀自动结算
Jan 07 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
Linux系统下使用XHProf和XHGui分析PHP运行性能
2015/12/08 PHP
php实现背景图上添加圆形logo图标的方法
2016/11/17 PHP
PHPStudy下如何为Apache安装SSL证书的方法步骤
2019/01/23 PHP
ext 同步和异步示例代码
2009/09/18 Javascript
别了 JavaScript中的isXX系列
2012/08/01 Javascript
js仿百度贴吧验证码特效实例代码
2014/01/16 Javascript
基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片
2015/09/06 Javascript
基于jQuery实现以手风琴方式展开和折叠导航菜单
2016/01/28 Javascript
AngularJS自动表单验证
2016/02/01 Javascript
AngularJS中实现用户访问的身份认证和表单验证功能
2016/04/21 Javascript
IE下JS保存图片的简单实例
2016/07/15 Javascript
JS实现页面数据无限加载
2016/09/13 Javascript
Angular2使用Angular CLI快速搭建工程(一)
2017/05/21 Javascript
浅谈Vue.js应用的四种AJAX请求数据模式
2017/08/30 Javascript
原生JS实现简单的倒计时功能示例
2018/08/30 Javascript
vue 双向数据绑定的实现学习之监听器的实现方法
2018/11/30 Javascript
ES6 如何改变JS内置行为的代理与反射
2019/02/11 Javascript
jquery轻量级数字动画插件countUp.js使用详解
2019/10/17 jQuery
js实现无刷新监听URL的变化示例代码详解
2020/06/03 Javascript
Python设计模式之代理模式实例
2014/04/26 Python
Python中绑定与未绑定的类方法用法分析
2016/04/29 Python
Python语言快速上手学习方法
2018/12/14 Python
OpenCV搞定腾讯滑块验证码的实现代码
2019/05/18 Python
导入tensorflow时报错:cannot import name 'abs'的解决
2019/10/10 Python
python系统指定文件的查找只输出目录下所有文件及文件夹
2020/01/19 Python
Python利用matplotlib绘制散点图的新手教程
2020/11/05 Python
Python实现粒子群算法的示例
2021/02/14 Python
HTML5 Canvas——用路径描画线条实例介绍
2013/06/09 HTML / CSS
绿化先进工作者事迹材料
2014/01/30 职场文书
应聘护士求职信
2014/07/21 职场文书
2014年标准化工作总结
2014/12/17 职场文书
市场部岗位职责范本
2015/04/15 职场文书
2015年度残疾人工作总结
2015/05/14 职场文书
springboot集成springCloud中gateway时启动报错的解决
2021/07/16 Java/Android
Canvas如何做个雪花屏版404的实现
2021/09/25 HTML / CSS
SpringBoot前端后端分离之Nginx服务器下载安装过程
2022/08/14 Servers