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中实例运用,欢迎收看!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490055.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文告诉你,谷歌是否真的实现了「量子至上」

▲ 上图展示的是量子计算机系统中的一个组成部分(稀释制冷机),这张照片拍摄于2016年的一间无尘运行室。如果量子计算机真的能够以超越传统计算机的速度与效率完成某种计算,那么“量子至上”目标就算是真正达成。但是,这…

有两个python怎么停用其中一_如何在python中停止另一个已经运行的脚本?

There is a way to start another script in python by doing this: import os os.system("python [name of script].py") So how can i stop another already running script? I would like to stop the script by using the name. 解决方案 It is more usual to i…

git 使用及常用命令

git在团队项目中的使用流程 1.首先从一个git远程仓库中clone项目到本地 ?1git clone 仓库地址2.创建开发分支 一般我们写代码不会在master分支上面写,而是新建一个分支 ?1git checkout -b test3.在test分支上面进行代码修改,比如完成某一项功能的开发 …

华为防火墙做单臂路由_华为单臂路由的配置方法步骤图

部署了VLAN的交换机可以实现在同一广播域内不同主机之间的通信,但是要想实现不同VLAN间主机通信,就要引入路由技术,可以通过二层交换机配合路由器来实现路由转发。下面是学习啦小编给大家整理的一些有关华为单臂路由配置方法,希望…

url主机域名可以省略_从输入url到页面完成加载发生了什么

作者 | Jake Zhang链接 | https://juejin.im/post/5e92f11b6fb9a03c46493880在写这篇文章之前本想着这个知识点涉及知识点太多太杂,找一篇大牛写的看看就算了,但是看了大概七八篇后,内心更纠结了——🙃🙃🙃…

Java的api中文文档

Java 8 中文版 - 在线API中文手册 - 码工具

揭秘毕加索被隐藏千年的“画中画”,神经网络让它重新面世

来源:technologyreview众所周知,毕加索是一位西班牙的天才画家,在20世纪时没有哪位艺术家能够像毕加索一样画风多变。毕加索的作品通常被分为9个时期,时期的名称尚有争议,大致是“蓝色时期”、“粉红色时期”、“立体主…

ssm如何支持热部署_Pipedrive如何在每天部署50+次的情况下支持质量发布?

作者 | Valeriia Iuzhakova 策划 | 田晓旭 “我把每一天都看作是比昨天高出一个档次的机会——无论是在服务质量、交付、速度还是业务的其它任何方面。”1 介绍 — 速度 Vs. 质量 客户总是在寻找有效的解决方案,来满足他们已经确定地需求,并为他们节省资…

armv7 cortex a系列编程手册_STM32、Cortex-M3和ARMv8-M之间的关联

大家都应该知道STM32、Cortex-M3、ARMv8-M与ARM有关,但可能分不清他们是什么关系,或者具体是什么东西。嵌入式开发直播课 - STM32 USART串口的应用 - 创客学院直播室​www.makeru.com.cn一、总述ARMv8-M:是一款ARM架构。ARM架构分为&#xff…

IDEA如何显示类的所有方法

ALT7(数字7) 例如在Thread类下(Thread.java)按ALT7,就能左下角显示这个类的所有方法,点击相应方法会跳到那个方法中

5G只是小儿科?任正非对话人工智能专家2万字实录

9月26日,深圳,华为公司创始人任正非对话两位人工智能专家杰里卡普兰和彼得柯克伦。来源:澎湃新闻9月26日下午,深圳,华为公司创始人任正非对话两位人工智能专家杰里卡普兰和彼得柯克伦,三人围绕“创新”&…

loading 遮罩demo

之前项目手写loading加载ingdemo&#xff0c; 其中涉及图片是项目中用到&#xff0c; 注意&#xff1a; loadingBar div需要放到页面内容最前面; 至于何时出现或者控制隐藏显示 可使用js灵活控制即可。 <!doctype html> <html> <head> <meta charset&quo…

centos jupyter 安装_centos7安装 jupyter

Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本&#xff0c;支持运行 40 多种编程语言。Jupyter Notebook 的本质是一个 Web 应用程序&#xff0c;便于创建和共享文学化程序文档&#xff0c;支持实时代码&#xff0c;数学方程&#xff0c;可视化和 markdown…

IDEA自动生成try catch异常处理语句

在写Java程序时&#xff0c;有些方法需要我们对其进行异常处理&#xff0c;例如线程的join方法&#xff0c;IDEA可以自动帮我们生成try catch语句 现在写一个join方法&#xff0c;发现下划线报错&#xff0c;因为需要对其异常处理 我们将鼠标放到报错处&#xff0c;按下altent…

c++ map 获取key列表_好未来Golang源码系列一:Map实现原理分析

分享老师&#xff1a;学而思网校 郭雨田一、map的结构与设计原理golang中map是一个kv对集合。底层使用hash table&#xff0c;用链表来解决冲突 &#xff0c;出现冲突时&#xff0c;不是每一个key都申请一个结构通过链表串起来&#xff0c;而是以bmap为最小粒度挂载&#xff0c…

windows使用python3.4生成二维码

1.首先下载qrcode库 使用pip命令&#xff1a; pip install qrcode python3.x以上的版本默认是安装好pip的&#xff0c;如果出现无法找到pip指令的信息的话&#xff0c;则需要首先安装pip。 2.然后安装PIL库 二维码的生成需要生成图像文件&#xff0c;PIL&#xff08;Python Ima…

Gartner 2019 年 BI 炒作周期五大趋势:增强分析、数字文化、关系分析、决策智能、实施和扩展...

来源&#xff1a;云头条Gartner研究副总裁Jim Hare声称&#xff1a;“由于智能/情报是所有数字化业务的核心&#xff0c;IT和业务负责人继续将分析和商业智能&#xff08;BI&#xff09;视为创新投资方面的重中之重。该炒作周期帮助数据和分析负责人过渡到增强分析&#xff0c;…

swift 选中长按项_Swift下使用UICollectionView 实现长按拖拽功能

导读简单用Swift写了一个collectionview的拖拽点击排序效果;拖拽排序是新闻类的App可以说是必有的交互设计&#xff0c;如今日头条&#xff0c;网易新闻等。GitHub地址&#xff1a;https://github.com/wangliujiayou/Swift-dragLabel 欢迎Star.效果主要代码手势长按移动1.给Col…

IDEA实现类自动输出需要实现的方法

在IDEA中写实现类时可以自动输出需要实现的方法&#xff0c;具体见下 首先定义一个实现Runnable接口的类 发现报错了&#xff0c;接着把鼠标放置报错的地方&#xff0c;按下altenter&#xff0c;选择下面红框 此时就会出现需要我们实现的接口中方法&#xff0c;点击ok

字典的数据怎么转变为excel_Excel小技巧——快速为多行数据排列名次

大家好&#xff0c;上一期我们介绍了合并单元格的自动排序小技巧&#xff0c;今天&#xff0c;再为大家准备一个排名表&#xff0c;下面我们就利用这个表格&#xff0c;来了解一下快速排名的方法吧。首先&#xff0c;我们在第一行排名单元格中输入今天要学习的公式前半部分。公…