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字典的常用操作方法小结
May 16 Python
python中使用print输出中文的方法
Jul 16 Python
朴素贝叶斯Python实例及解析
Nov 19 Python
python中使用while循环的实例
Aug 05 Python
Django CBV与FBV原理及实例详解
Aug 12 Python
Python3 JSON编码解码方法详解
Sep 06 Python
使用Python对Dicom文件进行读取与写入的实现
Apr 20 Python
python如何代码集体右移
Jul 20 Python
如何使用Python提取Chrome浏览器保存的密码
Jun 09 Python
Python中OpenCV实现简单车牌字符切割
Jun 11 Python
Python django中如何使用restful框架
Jun 23 Python
python编程实现清理微信重复缓存文件
Nov 01 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 ignore_user_abort与register_shutdown_function 使用方法
2009/06/14 PHP
解析centos中Apache、php、mysql 默认安装路径
2013/06/25 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
2014/07/05 PHP
php抓取网站图片并保存的实现方法
2015/10/29 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
PHP7 新增功能
2021/03/09 PHP
javascript 词法作用域和闭包分析说明
2010/08/12 Javascript
实测jquery data()如何存值
2013/08/18 Javascript
jQuery照片伸缩效果不影响其他元素的布局
2014/05/09 Javascript
JS实现三级折叠菜单特效,其它级可自动收缩
2015/08/06 Javascript
基于jQuery实现动态数字展示效果
2015/08/12 Javascript
js实现拖拽与碰撞检测
2020/09/18 Javascript
在vue中获取wangeditor的html和text的操作
2020/10/23 Javascript
javascript实现电商放大镜效果
2020/11/23 Javascript
[49:28]VP vs Optic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[05:37]DOTA2-DPC中国联赛 正赛 Elephant vs iG 选手采访
2021/03/11 DOTA
python在命令行下使用google翻译(带语音)
2014/01/16 Python
Python网页解析利器BeautifulSoup安装使用介绍
2015/03/17 Python
python实现通过代理服务器访问远程url的方法
2015/04/29 Python
pymongo为mongodb数据库添加索引的方法
2015/05/11 Python
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
2016/10/12 Python
json跨域调用python的方法详解
2017/01/11 Python
Python堆排序原理与实现方法详解
2018/05/11 Python
python开发实例之Python的Twisted框架中Deferred对象的详细用法与实例
2020/03/19 Python
Django数据统计功能count()的使用
2020/11/30 Python
socket.io 和canvas 实现的共享画板功能
2019/05/22 HTML / CSS
a标签下载链接的简单实现
2016/09/13 HTML / CSS
澳大利亚相机之家:Camera House
2017/11/30 全球购物
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?
2016/10/17 面试题
新闻专业推荐信范文
2013/11/20 职场文书
师范学院毕业生求职信
2014/06/24 职场文书
2014年党委工作总结
2014/11/22 职场文书
2015年部门工作总结范文
2015/03/31 职场文书
企业法人任命书
2015/09/21 职场文书
创业计划书之酒厂
2019/10/14 职场文书
python实现简单聊天功能
2021/07/07 Python