redis实例python_生产消费者模式与python+redis实例运用(基础篇)
根据这个图,我们举个简单的例子:假如你去某个餐厅吃饭,点了很多菜,厨师要一个一个菜的做,一个厨师不可能同时做出所有你点的菜,于是你有两个选择:第一个,厨师把所有菜都上齐了,你才开始吃;还有一个选择,做好一个菜,端上桌一个你开始吃一个。这里的厨师就是生产者,而你就是消费者,菜就是图中的product(产物)。我们可以很明显的感觉到,第一种选择会浪费很多时间,因为生产者要把所有产物生产完毕,消费者才开始从存储中介当中去取,而且可能会浪费大量的内存空间,上万条数据读到内存中或许你没有觉得,但是一旦数据量大了,就会很耗内存(这里指代存储中介可能是吧数据读到内存中);于是乎,生产消费者的优势就出现了。
在开始之前我们要明白,既然是生产消费者模式,那么我们的代码中就一定需要一个生产者,也需要一个消费者,在设计的时候我们要考虑到:1、生产者的速度跟不上消费者消费的速度,2、消费者速度跟不上生产者速度且存储中介因为某些原因只能容纳多少数据量。
针对以上第两点问题,这个时候对于资源就需要经过锁或者睡眠或者其他的操作来合理的分配,我们可以让消费者每次取的时候看看存储中介中是否有值,没有值的话就等待一会再取,生产者每次往存储中介中放数据的时候看一下是否快满了,如果快满了也一样睡眠一会再看是否可以放。针对消费者消费过慢的情况,我们可以在代码中开多进程和协程来解决这个问题,就好比这桌菜又多上得有快,我们就可以请几个朋友一起来吃,共同消费。对于生产消费者模式如果加锁,注意对于资源不要死锁就行,这部分会在《生产消费者模式与python+redis实例运用(中级篇)》里面写到
好了,基本原理和问题解决方针都有了,我们可以开始最基础的操作来实现一波:
首先是生产者的代码:
importtime
importredis
pool=redis.ConnectionPool(host='localhost',port=6379,db=1,decode_responses=True)
r=redis.Redis(connection_pool=pool)
defproduct(i):
length=r.llen("goods2")
print(length)
iflength>5000:
print("长度过大睡一会")
time.sleep(1)
product(i)
else:
#生产者r.lpush("goods2","good1"+str(i))
print("加入一个值睡一会")
# time.sleep(5)if__name__ == '__main__':
# 此处表示循环10000次,往redis里面放10000次数据fori inrange(10000):
product(i)
我们可以看到,每次当redis中的数据量大于5000的时候我们都让程序sleep一会,然后再去判断是否可以放,不能再睡1s。
接下来是消费者的代码:
fromDBUtil import*
fromclickhouse_driver importClient
importdatetime
importtime
importpandas aspd
frompandasql importsqldf
importredis
pool=redis.ConnectionPool(host='localhost',port=6379,db=1,decode_responses=True)
r=redis.Redis(connection_pool=pool)
defusers():
length = r.llen("goods2")
print(length)
whilelength>0:
goods = r.lpop("goods2")
print(goods)
ifstr(goods)=="None":
print("无值多等等")
time.sleep(10)
else:
print("无值等等")
time.sleep(10)
users()
if__name__ == '__main__':
users()
我们也可以看到,在redis队列中没有数据的时候,我们让消费者等10s,再次去请求。
好了,基础篇介绍到这里,接下来我们会介绍如何解决生产者过快,消费者过慢的问题解决方式以及生产消费者在python中实例运用,欢迎收看!
redis实例python_生产消费者模式与python+redis实例运用(基础篇)相关推荐
- RabbitMQ下的生产消费者模式与订阅发布模式
所谓模式,就是在某种场景下,一类问题及其解决方案的总结归纳.生产消费者模式与订阅发布模式是使用消息中间件时常用的两种模式,用于功能解耦和分布式系统间的消息通信,以下面两种场景为例: 数据接入 假 ...
- android经典的消费生产模式,生产消费者模式与Handler
Processor类需要有两个功能,一个是返回当前的地理信息,另一个功能是对信息进行处理加工后返回信息.所以,我们提供一个IProcess接口 public interface IProcessor ...
- java生成者消费者模式,java生产消费者模式
package productiveConsumption2; /* * 面包类 */ public class Bread { private int id; private String name ...
- python进阶记录之基础篇二十六_Python进阶记录之基础篇(十六)
回顾 在Python进阶记录之基础篇(十五)中,我们介绍了面向对象的基本概念以及Python中类和对象的基础知识,需要重点掌握类的创建和对象的使用.今天我们继续讲一下Python中面向对象的相关知识点 ...
- Python学习日记-day1基础篇 字符 输出 注释
Python学习日记-day1基础篇 字符 输出 注释 by北栀一刺 # -*- coding: utf-8 -*- """ Spyder EditorThis is a ...
- python queue 生产者 消费者_Queue: 应用于生产者-消费者模式的Python队列
图片来源于网络 版权声明 © 著作权归作者所有 允许自由转载,但请保持署名和原文链接. 不允许商业用途.盈利行为及衍生盈利行为. 什么是Queue? Queue是Python标准库中的线程安全的队列( ...
- python爬虫实例-记录一次简单的Python爬虫实例
本次的这篇文章主要是和大家分享了一篇关于记录一次简单的Python爬虫实例 ,有需要的小伙伴可以看一下. 主要流程分为: 爬取.整理.存储 1.其中用到几个包,包括 requests 用于向网站发送请 ...
- python新手菜鸟之基础篇
s=0 for i in range(1,101):s += i else:print(s) def main(n):'''打印菱形图形'''for i in range(n):print((' * ...
- Python自动化开发之基础篇--Day1
一.Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC ...
最新文章
- 哪些编程语言需要修复?
- 2020年前必须掌握的数据库面试问题~
- 关于测试用例的一些思考
- C++ —— C++三大分支结构(顺序、选择、循环)
- Linux上的JAVA的IDE,在linux上运行的基于文本的强大java IDE
- asp.net 将bmp格式图片怎么转换为jpg_Heic图片转换精灵-Heic图片高清转换JPG/PNG/BMP方法...
- 围圈报数(信息学奥赛一本通-T1334)
- Python使用wordnet工具计算词集与词条基本用法(一)
- android 静态编译链接,Android NDK:使用预编译的静态库链接
- android httpurlconnection 超时 重发_Android / Java | 向服务器传文件
- js去除字符串头尾空格
- 移动硬盘打不开,换一台电脑就又可以打开了
- 仿钉钉考勤统计圆形控件
- 【小林课堂】【光学】透镜成像应用
- 【全自动网盘扩容软件使用教程】百度网盘自助无限扩容+自助无限修复软件使用步骤说明
- 屏蔽电脑上所有的广告推送(亲测可用)
- 【node】mac系统下升级node版本
- Bloom filter 过滤(布隆过滤算法)原理
- ps里jpg格式的图怎么保存成透明的
- Linux常用命令详解(两万字超长文)
热门文章
- 微服务 注册中心的作用_102,谈谈微服务注册中心zookeeperamp;Eureka
- springboot设置运行内存_Docker 如何运行多个 Springboot?
- python面试总结(二)列表去重与单例
- 12.MYSQL高级(二)
- 无连接网络通信程序UDP
- 厂办大集体改制不签字_许昌二印,磨砂技术被外国觊觎,老工人说烂在肚子里也不外漏...
- mysql5.7.17二进制包_mysql5.7二进制包安装方法
- 系统错误_Win10系统提示0x80004005错误的解决方法
- python odoo_odoo python 使用缓存
- Facebook刷新开放域问答SOTA:模型训模型!Reader当Teacher!