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 相关文章推荐
在Linux下调试Python代码的各种方法
Apr 17 Python
浅谈Python中的数据类型
May 05 Python
用C++封装MySQL的API的教程
May 06 Python
Python pickle模块用法实例分析
May 27 Python
关于Python中Inf与Nan的判断问题详解
Feb 08 Python
浅谈flask源码之请求过程
Jul 26 Python
Python pip替换为阿里源的方法步骤
Jul 02 Python
numpy数组广播的机制
Jul 12 Python
利用python实现周期财务统计可视化
Aug 25 Python
浅谈keras 的抽象后端(from keras import backend as K)
Jun 16 Python
PyQt5 QDockWidget控件应用详解
Aug 12 Python
python与c语言的语法有哪些不一样的
Sep 13 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容易被忽略而出错陷阱 数字与字符串比较
2011/11/10 PHP
PHP小技巧之JS和CSS优化工具Minify的使用方法
2014/05/19 PHP
PHP几个实用自定义函数小结
2016/01/25 PHP
在laravel中实现事务回滚的方法
2019/10/10 PHP
jquery 批量上传图片实现代码
2010/01/28 Javascript
nodejs中的fiber(纤程)库详解
2015/03/24 NodeJs
浅谈String.valueOf()方法的使用
2016/06/06 Javascript
JavaScript用JSONP跨域请求数据实例详解
2017/01/06 Javascript
jQuery日程管理控件glDatePicker用法详解
2017/03/29 jQuery
ReactNative Image组件使用详解
2017/08/07 Javascript
浅析JS抽象工厂模式
2017/12/14 Javascript
vue中实现图片和文件上传的示例代码
2018/03/16 Javascript
基于Vue实现拖拽功能
2020/07/29 Javascript
记一次webapck4 配置文件无效的解决历程
2018/09/19 Javascript
在create-react-app中使用sass的方法示例
2018/10/01 Javascript
详解key在Vue列表渲染时究竟起到了什么作用
2019/04/20 Javascript
JS异步宏队列与微队列原理区别详解
2020/07/02 Javascript
使用Typescript开发微信小程序的步骤详解
2021/01/12 Javascript
[14:00]DOTA2国际邀请赛史上最长大战 赛后专访B神
2013/08/10 DOTA
python实现定时自动备份文件到其他主机的实例代码
2018/02/23 Python
在Python中字典根据多项规则排序的方法
2019/01/21 Python
Python自动化完成tb喵币任务的操作方法
2019/10/30 Python
Pytorch实现神经网络的分类方式
2020/01/08 Python
python中sympy库求常微分方程的用法
2020/04/28 Python
Unix控制后台进程都有哪些进程
2016/09/22 面试题
司法建议书范文
2014/05/13 职场文书
先进教师事迹材料
2014/12/16 职场文书
2015世界地球日活动总结
2015/02/09 职场文书
2015年个人审计工作总结
2015/04/07 职场文书
企业财务经理岗位职责
2015/04/08 职场文书
2015年幼儿园班务工作总结
2015/05/12 职场文书
公司员工宿舍管理制度
2015/08/07 职场文书
餐饮行业关注的9大营销策略
2019/08/26 职场文书
Vue如何实现组件间通信
2021/05/15 Vue.js
Python爬虫基础之简单说一下scrapy的框架结构
2021/06/26 Python
Redis 操作多个数据库的配置的方法实现
2022/03/23 Redis