Python之两种模式的生产者消费者模型详解


Posted in Python onOctober 26, 2018

第一种使用queue队列实现:

#生产者消费者模型 其实服务器集群就是这个模型
# 这里介绍的是非yield方法实现过程

import threading,time
import queue
q = queue.Queue(maxsize=10)

def Producer(anme):
 # for i in range(10):
 #  q.put('骨头%s'%i)
 count = 1
 while True:
  q.put('骨头%s'%count)
  print('生产了骨头',count)
  count += 1
  time.sleep(1)

def Consumer(name):
 # while q.qsize() >0:
 while True:
  print('[%s] 取到[%s] 并且吃了它...'%(name,q.get()))
  time.sleep(1)

p = threading.Thread(target=Producer,args=('shenchanzhe',))
c = threading.Thread(target=Consumer,args=('xiaofeizhe01',))
c1 = threading.Thread(target=Consumer,args=('xiaofeizhe02',))

p.start()
c.start()
c1.start()

使用yield协程的方法来实现生产者和消费者:

#生产者和消费者,使用生成器的方式,就是一个简单的并行,
import time
# 这是一个消费者 一直在等待完成吃包子的动作
def consumer(name):
 print('%s准备吃包子了!'%name) #打印出对应的消费者的名字
 while True: #执行一个死循环 实际上就是需要调用时才会执行,没有调用就会停止在yield
  baozi = yield #在它就收到内容的时候后就把内容传给baozi
  print('包子【%s】来了,被【%s】吃了'%(baozi,name))
def producer(name):
 c1 = consumer('A') #它只是把c1变成一个生成器
 c2 = consumer('B')
 c1.__next__() #第一个next只是会走到yield然后停止
 c2.__next__()
 print('老子开始做包子了')
 for i in range(1,10):
  time.sleep(1)
  print('三秒做了两个包子')
  c1.send(i) #这一步其实就是调用next方法的同时传一个参数i给field接收,然后baozi=i
  c2.send(i+1)
  #其实这里是这样的,在send的时候只是继续执行yield下面的语句,然后去去yield,再次停在这儿

# producer('aea')
c = consumer('aaa') #没next一次就会将程序执行一次
c.__next__()
c.__next__()
c.__next__()

以上这篇Python之两种模式的生产者消费者模型详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python urlopen 使用小示例
Sep 06 Python
Python数据结构与算法之字典树实现方法示例
Dec 13 Python
解决Matplotlib图表不能在Pycharm中显示的问题
May 24 Python
Python设置在shell脚本中自动补全功能的方法
Jun 25 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
Aug 17 Python
PyTorch加载预训练模型实例(pretrained)
Jan 17 Python
python logging.basicConfig不生效的原因及解决
Feb 20 Python
Python离线安装各种库及pip的方法
Nov 28 Python
python3 googletrans超时报错问题及翻译工具优化方案 附源码
Dec 23 Python
基于 Python 实践感知器分类算法
Jan 07 Python
python中xlrd模块的使用详解
Feb 01 Python
python tkinter Entry控件的焦点移动操作
May 22 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
Oct 26 #Python
Python批处理更改文件名os.rename的方法
Oct 26 #Python
浅谈django rest jwt vue 跨域问题
Oct 26 #Python
Python os.rename() 重命名目录和文件的示例
Oct 25 #Python
python实现旋转和水平翻转的方法
Oct 25 #Python
使用Python实现从各个子文件夹中复制指定文件的方法
Oct 25 #Python
python 实现对文件夹中的图像连续重命名方法
Oct 25 #Python
You might like
提升PHP性能的21种方法介绍
2013/06/25 PHP
PHP自定义递归函数实现数组转JSON功能【支持GBK编码】
2018/07/17 PHP
把textarea中字符串里含有的回车换行替换成<br>的javascript代码
2007/04/20 Javascript
jquery 鼠标滑动显示详情应用示例
2014/01/24 Javascript
跟我学习JScript的Bug与内存管理
2015/11/18 Javascript
浅谈js和css内联外联注意事项
2016/06/30 Javascript
ES6数组的扩展详解
2017/04/25 Javascript
用户管理的设计_jquery的ajax实现二级联动效果
2017/07/13 jQuery
Vue组件通信实践记录(推荐)
2017/08/15 Javascript
解决js ajax同步请求造成浏览器假死的问题
2018/01/18 Javascript
JS简单实现查看文档创建日期、修改日期和文档大小的方法示例
2018/04/08 Javascript
Vue + better-scroll 实现移动端字母索引导航功能
2018/05/07 Javascript
Vue多组件仓库开发与发布详解
2019/02/28 Javascript
Node.js 实现简单的无侵入式缓存框架的方法
2019/07/21 Javascript
Python的面向对象编程方式学习笔记
2016/07/12 Python
django创建简单的页面响应实例教程
2019/09/06 Python
Python中的引用和拷贝实例解析
2019/11/14 Python
keras Lambda自定义层实现数据的切片方式,Lambda传参数
2020/06/11 Python
python之pygame模块实现飞机大战完整代码
2020/11/29 Python
Draper James官网:知名演员瑞茜·威瑟斯彭所创品牌
2017/10/25 全球购物
西班牙国家航空官方网站:Iberia
2017/11/16 全球购物
微软加拿大官方网站:Microsoft Canada
2019/04/28 全球购物
公务员总结性个人自我评价
2013/12/05 职场文书
小学英语教师先进事迹
2014/05/28 职场文书
医生党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
领导班子群众路线与四风问题对照检查材料思想汇报
2014/10/11 职场文书
2014年保密工作总结
2014/11/22 职场文书
优秀班主任主要事迹材料
2014/12/16 职场文书
师德先进个人事迹材料
2014/12/19 职场文书
参观邀请函范文
2015/02/02 职场文书
工会文体活动总结
2015/05/07 职场文书
小学毕业感言200字
2015/07/30 职场文书
2016年寒假政治学习心得体会
2015/10/09 职场文书
高中数学课堂教学反思
2016/02/18 职场文书
小程序后台PHP版本部署运行 LNMP+WNMP
2021/04/01 Servers
Python基本知识点总结
2022/04/07 Python