详解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中的私有属性
Aug 21 Python
全面解析Python的While循环语句的使用方法
Oct 13 Python
python 容器总结整理
Apr 04 Python
Django forms组件的使用教程
Oct 08 Python
python实现dijkstra最短路由算法
Jan 17 Python
python爬虫selenium和phantomJs使用方法解析
Aug 08 Python
python 爬取古诗文存入mysql数据库的方法
Jan 08 Python
python实现快递价格查询系统
Mar 03 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
May 04 Python
Django Path转换器自定义及正则代码实例
May 29 Python
Python实现快速大文件比较代码解析
Sep 04 Python
在vscode中启动conda虚拟环境的思路详解
Dec 25 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
解决phpcms更换javascript的幻灯片代码调用图片问题
2014/12/26 PHP
使用WordPress发送电子邮件的相关PHP函数用法解析
2015/12/15 PHP
jquery+thinkphp实现跨域抓取数据的方法
2016/10/15 PHP
php array_slice 取出数组中的一段序列实例
2016/11/04 PHP
golang 调用 php7详解及实例
2017/01/04 PHP
php实现留言板功能
2017/03/05 PHP
图片之间的切换
2006/06/26 Javascript
用js解决数字不能换行问题
2010/08/10 Javascript
js点击button按钮跳转到另一个新页面
2014/10/10 Javascript
node.js中的querystring.escape方法使用说明
2014/12/10 Javascript
JavaScript实现列出数组中最长的连续数
2014/12/29 Javascript
jQuery中filter()方法用法实例
2015/01/06 Javascript
jQuery过滤选择器经典应用
2016/08/18 Javascript
javascript 中模板方法单例的实现方法
2017/10/17 Javascript
vue基于element的区间选择组件
2018/09/07 Javascript
小程序自定义单页面、全局导航栏的实现代码
2019/03/15 Javascript
node使用mysql获取数据库数据中文乱码问题的解决
2019/12/02 Javascript
Vue快速实现通用表单验证功能
2019/12/05 Javascript
[58:12]Ti4第二日主赛事败者组 LGD vs iG 3
2014/07/21 DOTA
跟老齐学Python之集合的关系
2014/09/24 Python
Python中zfill()方法的使用教程
2015/05/20 Python
TensorFlow 滑动平均的示例代码
2018/06/19 Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
2018/11/29 Python
python+numpy按行求一个二维数组的最大值方法
2019/07/09 Python
10个Python面试常问的问题(小结)
2019/11/20 Python
Python列表去重复项的N种方法(实例代码)
2020/05/12 Python
Python并发爬虫常用实现方法解析
2020/11/19 Python
开发人员所需要知道的HTML5性能分析面面观
2012/07/05 HTML / CSS
html5移动端价格输入键盘的实现
2019/09/16 HTML / CSS
洲际酒店集团美国官网:IHG美国
2017/11/16 全球购物
任课老师推荐信范文
2013/11/24 职场文书
美容院营销方案
2014/03/05 职场文书
邀请函怎么写
2015/01/30 职场文书
2015年高校保卫处工作总结
2015/07/23 职场文书
Python中else的三种使用场景
2021/06/16 Python
python ConfigParser库的使用及遇到的坑
2022/02/12 Python