详解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中__call__用法实例
Aug 29 Python
python实现实时监控文件的方法
Aug 26 Python
centos6.7安装python2.7.11的具体方法
Jan 16 Python
Python MySQL数据库连接池组件pymysqlpool详解
Jul 07 Python
利用python库在局域网内传输文件的方法
Jun 04 Python
python tornado微信开发入门代码
Aug 24 Python
python+splinter自动刷新抢票功能
Sep 25 Python
python爬虫获取小区经纬度以及结构化地址
Dec 30 Python
python配置grpc环境
Jan 01 Python
pyQt5实时刷新界面的示例
Jun 25 Python
用Python实现屏幕截图详解
Jan 22 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
fleaphp下不确定的多条件查询的巧妙解决方法
2008/09/11 PHP
在win7中搭建Linux+PHP 开发环境
2014/10/08 PHP
Laravel 5框架学习之环境与配置
2015/04/08 PHP
PHP代码优化技巧小结
2015/09/29 PHP
PHP与Web页面的交互示例详解一
2020/08/04 PHP
javascript将异步校验表单改写为同步表单
2015/01/27 Javascript
JavaScript数据结构与算法之栈详解
2015/03/12 Javascript
javascript委托(Delegate)blur和focus用法实例分析
2015/05/26 Javascript
基于jquery实现轮播焦点图插件
2016/03/31 Javascript
AngularJs $parse、$eval和$observe、$watch详解
2016/09/21 Javascript
axios基本入门用法教程
2017/03/25 Javascript
input框中自动展示当前日期yyyy/mm/dd的实现方法
2017/07/06 Javascript
vue使用axios时关于this的指向问题详解
2017/12/22 Javascript
vue v-model动态生成详解
2018/06/30 Javascript
vue的for循环使用方法
2019/02/12 Javascript
vue 的 solt 子组件过滤过程解析
2019/09/07 Javascript
使用Vue-cli 中为单独页面设置背景图片铺满全屏
2020/07/17 Javascript
[02:16]深扒TI7聊天轮盘语音出处2
2017/05/11 DOTA
Python GAE、Django导出Excel的方法
2008/11/24 Python
利用Python爬虫给孩子起个好名字
2017/02/14 Python
python线程池threadpool实现篇
2018/04/27 Python
Python3用tkinter和PIL实现看图工具
2018/06/21 Python
win10 64bit下python NLTK安装教程
2018/09/19 Python
Python实现制度转换(货币,温度,长度)
2019/07/14 Python
python字典和json.dumps()的遇到的坑分析
2020/03/11 Python
对Matlab中共轭、转置和共轭装置的区别说明
2020/05/11 Python
Python爬虫与反爬虫大战
2020/07/30 Python
canvas实现高阶贝塞尔曲线(N阶贝塞尔曲线生成器)
2018/01/10 HTML / CSS
空指针到底是什么
2012/08/07 面试题
后勤自我鉴定
2013/10/13 职场文书
模具专业推荐信
2013/10/30 职场文书
大学生求职简历自我评价
2015/03/02 职场文书
青年联谊会致辞
2015/07/31 职场文书
Python 文本滚动播放器的实现代码
2021/04/25 Python
python+pytest接口自动化之token关联登录的实现
2022/04/06 Python
Mysql 文件配置解析介绍
2022/05/06 MySQL