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实现在控制台输入密码不显示的方法
Jul 02 Python
Python for Informatics 第11章 正则表达式(一)
Apr 21 Python
Python中使用多进程来实现并行处理的方法小结
Aug 09 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
May 28 Python
Django中的用户身份验证示例详解
Aug 07 Python
Python队列、进程间通信、线程案例
Oct 25 Python
Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析
Nov 07 Python
Python和Sublime整合过程图示
Dec 25 Python
在Pytorch中计算自己模型的FLOPs方式
Dec 30 Python
使用Tensorflow将自己的数据分割成batch训练实例
Jan 20 Python
Python如何读取、写入CSV数据
Jul 28 Python
Python+OpenCV检测灯光亮点的实现方法
Nov 02 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下使用curl模拟用户登陆的代码
2010/09/10 PHP
SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
2012/06/17 PHP
sae使用smarty模板的方法
2013/12/17 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
jquery 新手学习常见问题解决方法
2010/04/18 Javascript
jquery 注意事项与常用语法小结
2010/06/07 Javascript
JavaScript基于对象去除数组重复项的方法
2016/10/09 Javascript
JS限定手机版中图片大小随分辨率自动调整的方法
2016/12/05 Javascript
Bootstrap源码学习笔记之bootstrap进度条
2016/12/24 Javascript
解决Vue router-link绑定事件不生效的问题
2020/07/22 Javascript
vue项目如何监听localStorage或sessionStorage的变化
2021/01/04 Vue.js
[47:31]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第一场 12.12
2020/12/16 DOTA
对于Python装饰器使用的一些建议
2015/06/03 Python
Python 正则表达式的高级用法
2016/12/04 Python
Django实现的自定义访问日志模块示例
2017/06/23 Python
python使用fcntl模块实现程序加锁功能示例
2017/06/23 Python
Python微信库:itchat的用法详解
2017/08/14 Python
Python 模拟员工信息数据库操作的实例
2017/10/23 Python
python opencv之SURF算法示例
2018/02/24 Python
Python3实现的字典遍历操作详解
2018/04/18 Python
如何用Python实现简单的Markdown转换器
2018/07/16 Python
对Python中plt的画图函数详解
2018/11/07 Python
Django渲染Markdown文章目录的方法示例
2019/01/02 Python
Python单元测试与测试用例简析
2019/11/09 Python
深入浅析Python 命令行模块 Click
2020/03/11 Python
python类共享变量操作
2020/09/03 Python
socket.io 和canvas 实现的共享画板功能
2019/05/22 HTML / CSS
澳大利亚在线家具店:Luxo Living
2019/03/24 全球购物
期中考试后的反思
2014/02/08 职场文书
三好学生演讲稿范文
2014/04/26 职场文书
爱我中华演讲稿
2014/05/20 职场文书
2014年党风廉政建设工作总结
2014/11/19 职场文书
门卫管理制度范本
2015/08/05 职场文书
《秋天的怀念》教学反思
2016/02/17 职场文书
pytorch Dropout过拟合的操作
2021/05/27 Python
关于pytest结合csv模块实现csv格式的数据驱动问题
2022/05/30 Python