生产消费者模式与python+redis实例运用(基础篇)
根据这个图,我们举个简单的例子:假如你去某个餐厅吃饭,点了很多菜,厨师要一个一个菜的做,一个厨师不可能同时做出所有你点的菜,于是你有两个选择:第一个,厨师把所有菜都上齐了,你才开始吃;还有一个选择,做好一个菜,端上桌一个你开始吃一个。这里的厨师就是生产者,而你就是消费者,菜就是图中的product(产物)。我们可以很明显的感觉到,第一种选择会浪费很多时间,因为生产者要把所有产物生产完毕,消费者才开始从存储中介当中去取,而且可能会浪费大量的内存空间,上万条数据读到内存中或许你没有觉得,但是一旦数据量大了,就会很耗内存(这里指代存储中介可能是吧数据读到内存中);于是乎,生产消费者的优势就出现了。
在开始之前我们要明白,既然是生产消费者模式,那么我们的代码中就一定需要一个生产者,也需要一个消费者,在设计的时候我们要考虑到:1、生产者的速度跟不上消费者消费的速度,2、消费者速度跟不上生产者速度且存储中介因为某些原因只能容纳多少数据量。
针对以上第两点问题,这个时候对于资源就需要经过锁或者睡眠或者其他的操作来合理的分配,我们可以让消费者每次取的时候看看存储中介中是否有值,没有值的话就等待一会再取,生产者每次往存储中介中放数据的时候看一下是否快满了,如果快满了也一样睡眠一会再看是否可以放。针对消费者消费过慢的情况,我们可以在代码中开多进程和协程来解决这个问题,就好比这桌菜又多上得有快,我们就可以请几个朋友一起来吃,共同消费。对于生产消费者模式如果加锁,注意对于资源不要死锁就行,这部分会在《生产消费者模式与python+redis实例运用(中级篇)》里面写到
好了,基本原理和问题解决方针都有了,我们可以开始最基础的操作来实现一波:
首先是生产者的代码:
import time
import redis pool=redis.ConnectionPool(host='localhost', port=,db=,decode_responses=True)
r=redis.Redis(connection_pool=pool) def product(i): length=r.llen("goods2")
print(length)
if length>:
print("长度过大睡一会")
time.sleep()
product(i)
else:
#生产者
r.lpush("goods2", "good1"+str(i))
print("加入一个值睡一会")
# time.sleep(5)
if __name__ == '__main__':
# 此处表示循环10000次,往redis里面放10000次数据
for i in range():
product(i)
我们可以看到,每次当redis中的数据量大于5000的时候我们都让程序sleep一会,然后再去判断是否可以放,不能再睡1s。
接下来是消费者的代码:
from DBUtil import *
from clickhouse_driver import Client
import datetime
import time
import pandas as pd
from pandasql import sqldf
import redis pool=redis.ConnectionPool(host='localhost', port=,db=,decode_responses=True)
r=redis.Redis(connection_pool=pool) def users():
length = r.llen("goods2")
print(length)
while length>:
goods = r.lpop("goods2")
print(goods)
if str(goods)=="None":
print("无值多等等")
time.sleep() else:
print("无值等等")
time.sleep()
users() if __name__ == '__main__':
users()
我们也可以看到,在redis队列中没有数据的时候,我们让消费者等10s,再次去请求。
好了,基础篇介绍到这里,接下来我们会介绍如何解决生产者过快,消费者过慢的问题解决方式以及生产消费者在python中实例运用,欢迎收看!
生产消费者模式与python+redis实例运用(基础篇)的更多相关文章
- 生产消费者模式与python+redis实例运用(中级篇)
上一篇文章介绍了生产消费者模式与python+redis实例运用(基础篇),但是依旧遗留了一个问题,就是如果消费者消费的速度跟不上生产者,依旧会浪费我们大量的时间去等待,这时候我们就可以考虑使用多进程 ...
- Python | 面试的常客,经典的生产消费者模式
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第23篇文章,我们来聊聊关于多线程的一个经典设计模式. 在之前的文章当中我们曾经说道,在多线程并发的场景当中,如果我 ...
- RabbitMQ下的生产消费者模式与订阅发布模式
所谓模式,就是在某种场景下,一类问题及其解决方案的总结归纳.生产消费者模式与订阅发布模式是使用消息中间件时常用的两种模式,用于功能解耦和分布式系统间的消息通信,以下面两种场景为例: 数据接入 假设 ...
- Kafka下的生产消费者模式与订阅发布模式
原文:https://blog.csdn.net/zwgdft/article/details/54633105 在RabbitMQ下的生产消费者模式与订阅发布模式一文中,笔者以“数据接入”和“事 ...
- day11(多线程,唤醒机制,生产消费者模式,多线程的生命周期)
A:进程: 进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. B:线程: 线程是进程中的一个执行单元,负责当前进程中程序的执 ...
- 智普教育Python视频教程之入门基础篇,python笔记
智普教育Python视频教程之入门基础篇,python笔记 print id()内存地址 type()变量类型 windows命令行下edit命令 python数据类型不需要指定类型 定义hostna ...
- Python(三)基础篇之「模块&面向对象编程」
[笔记]Python(三)基础篇之「模块&面向对象编程」 2016-12-07 ZOE 编程之魅 Python Notes: ★ 如果你是第一次阅读,推荐先浏览:[重要公告]文章更新. ...
- Python(四)基础篇之「文件对象&错误处理」
[笔记]Python(四)基础篇之「文件对象&错误处理」 2016-12-08 ZOE 编程之魅 Python Notes: ★ 如果你是第一次阅读,推荐先浏览:[重要公告]文章更新. ...
- Python学习笔记之基础篇(-)python介绍与安装
Python学习笔记之基础篇(-)初识python Python的理念:崇尚优美.清晰.简单,是一个优秀并广泛使用的语言. python的历史: 1989年,为了打发圣诞节假期,作者Guido开始写P ...
随机推荐
- HTTP之cookie技术
Cookie由变量名和值组成, 其属性中既有标准的Cookie变量, 也有用户自己创建的变量,属性中变量是用"变量=值"形式来保存 Cookie格式如下: Set-Cookie: ...
- java 正则表达式 验证邮箱
import java.util.regex.Matcher; import java.util.regex.Pattern; public class demo1 { /**java正则表达式 * ...
- [bzoj2038]莫队算法学习
解题关键:莫队最重要的是区间之间以$O(1)$的复杂度进行转化,由于电脑原因,后续补上公式推导. #include<cstdio> #include<cstring> #inc ...
- Google浏览器插件
Scholarscope XPath Helper Web Scraper JSON-handle User-Agent Swicher Markdown Here
- neon eclipse tomcat发布项目乱码
解决方法如图
- JavaScript中的构造函数和工厂函数说明
在cnblog上看到一篇文章,讲解JS中的构造函数和工厂函数,觉得讲的真好 JavaScript中的工厂函数和构造函数都能用来创建一个对象,我们可以来看看下面的例子 构造函数 function cre ...
- UT源码116
2)NextDate函数问题 NextDate函数说明一种复杂的关系,即输入变量之间逻辑关系的复杂性 NextDate函数包含三个变量month.day和year,函数的输出为输入日期后一天的日期. ...
- IPMITOOL 配置BMC用户设置
IPMITOOL 配置BMC用户设置 本文档共介绍5条ipmi设置user的命令,这些命令需要使用root权限才能使用,其中- H为需要操作的BMC ip,-I lanplus为使用rmcp+协议发送 ...
- VS插件开发(生成实体类)
写了N年的代码,回头过来看,其中有80%代码都是重复的代码,深入研究VS插件开发,应用到工作中,让自己减少基础的代码开发,增加开发效率 1.新增解决方案: Extensiblity->VSIX ...
- C++基础之C++编译调试
C++程序的实现(预处理,编译,连接)Linux平台编译gcc和g++都是GNU的编译器.1.对于.c后缀的文件,gcc把它当做是C程序:g++当做是C++程序:2.对于.cpp后缀的文件,gcc和 ...