详解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多线程编程(一):threading模块综述
Apr 05 Python
在Python中使用PIL模块处理图像的教程
Apr 29 Python
Python使用遗传算法解决最大流问题
Jan 29 Python
用Django实现一个可运行的区块链应用
Mar 08 Python
彻底理解Python中的yield关键字
Apr 01 Python
Python socket模块实现的udp通信功能示例
Apr 10 Python
Python_查看sqlite3表结构,查询语句的示例代码
Jul 17 Python
Django 数据库同步操作技巧详解
Jul 19 Python
基于python的itchat库实现微信聊天机器人(推荐)
Oct 29 Python
使用pytorch完成kaggle猫狗图像识别方式
Jan 10 Python
python实现从ftp服务器下载文件
Mar 03 Python
如何基于python把文字图片写入word文档
Jul 31 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
PHP微信分享开发详解
2017/01/14 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
原生JS实现Ajax通过GET方式与PHP进行交互操作示例
2018/05/12 PHP
用js实现的一个Flash滚动轮换显示图片代码生成器
2007/03/14 Javascript
js 纯数字不重复排列的另类方法
2010/07/17 Javascript
JavaScript中的关键字"VAR"使用详解 分享
2013/07/31 Javascript
仿百度的关键词匹配搜索示例
2013/09/25 Javascript
JavaScript对象学习经验整理
2013/10/12 Javascript
Three.js学习之文字形状及自定义形状
2016/08/01 Javascript
更靠谱的H5横竖屏检测方法(js代码)
2016/09/13 Javascript
Bootstrap php制作动态分页标签
2016/12/23 Javascript
vue2.0在table中实现全选和反选的示例代码
2017/11/04 Javascript
微信小程序实现指定显示行数多余文字去掉用省略号代替
2018/07/25 Javascript
浅谈微信JS-SDK 微信分享接口开发(介绍版)
2018/08/15 Javascript
JS实现随机生成10个手机号的方法示例
2018/12/07 Javascript
vue-cli2 构建速度优化的实现方法
2019/01/08 Javascript
通过JS运行机制的角度说说作用域
2019/03/12 Javascript
vue-element-admin 菜单标签失效的解决方式
2019/11/12 Javascript
写给新手同学的vuex快速上手指北小结
2020/04/14 Javascript
利用Python绘制数据的瀑布图的教程
2015/04/07 Python
Python中list初始化方法示例
2016/09/18 Python
python使用mysql的两种使用方式
2018/03/07 Python
python执行系统命令后获取返回值的几种方式集合
2018/05/12 Python
Flask框架中request、请求钩子、上下文用法分析
2019/07/23 Python
Tensorflow设置显存自适应,显存比例的操作
2020/02/03 Python
Python使用socket_TCP实现小文件下载功能
2020/10/09 Python
python爬虫用scrapy获取影片的实例分析
2020/11/23 Python
利用python如何实现猫捉老鼠小游戏
2020/12/04 Python
JD Sports马来西亚:英国领先的运动鞋和运动服饰零售商
2018/03/13 全球购物
Nice Kicks网上商店:ShopNiceKicks.com
2018/12/25 全球购物
软件工程师岗位职责
2013/11/16 职场文书
大学生个人自荐信样本
2014/03/02 职场文书
计划生育标语
2014/06/23 职场文书
大三学生英语考试作弊检讨书
2015/01/01 职场文书
幼儿园小班教学反思
2016/03/03 职场文书
react中useState使用:如何实现在当前表格直接更改数据
2022/08/05 Javascript