根据这个图,我们举个简单的例子:假如你去某个餐厅吃饭,点了很多菜,厨师要一个一个菜的做,一个厨师不可能同时做出所有你点的菜,于是你有两个选择:第一个,厨师把所有菜都上齐了,你才开始吃;还有一个选择,做好一个菜,端上桌一个你开始吃一个。这里的厨师就是生产者,而你就是消费者,菜就是图中的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实例运用(基础篇)的更多相关文章

  1. 生产消费者模式与python+redis实例运用(中级篇)

    上一篇文章介绍了生产消费者模式与python+redis实例运用(基础篇),但是依旧遗留了一个问题,就是如果消费者消费的速度跟不上生产者,依旧会浪费我们大量的时间去等待,这时候我们就可以考虑使用多进程 ...

  2. Python | 面试的常客,经典的生产消费者模式

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第23篇文章,我们来聊聊关于多线程的一个经典设计模式. 在之前的文章当中我们曾经说道,在多线程并发的场景当中,如果我 ...

  3. RabbitMQ下的生产消费者模式与订阅发布模式

    所谓模式,就是在某种场景下,一类问题及其解决方案的总结归纳.生产消费者模式与订阅发布模式是使用消息中间件时常用的两种模式,用于功能解耦和分布式系统间的消息通信,以下面两种场景为例: 数据接入   假设 ...

  4. Kafka下的生产消费者模式与订阅发布模式

    原文:https://blog.csdn.net/zwgdft/article/details/54633105   在RabbitMQ下的生产消费者模式与订阅发布模式一文中,笔者以“数据接入”和“事 ...

  5. day11(多线程,唤醒机制,生产消费者模式,多线程的生命周期)

    A:进程: 进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. B:线程: 线程是进程中的一个执行单元,负责当前进程中程序的执 ...

  6. 智普教育Python视频教程之入门基础篇,python笔记

    智普教育Python视频教程之入门基础篇,python笔记 print id()内存地址 type()变量类型 windows命令行下edit命令 python数据类型不需要指定类型 定义hostna ...

  7. Python(三)基础篇之「模块&面向对象编程」

    [笔记]Python(三)基础篇之「模块&面向对象编程」 2016-12-07 ZOE    编程之魅  Python Notes: ★ 如果你是第一次阅读,推荐先浏览:[重要公告]文章更新. ...

  8. Python(四)基础篇之「文件对象&错误处理」

    [笔记]Python(四)基础篇之「文件对象&错误处理」 2016-12-08 ZOE    编程之魅  Python Notes: ★ 如果你是第一次阅读,推荐先浏览:[重要公告]文章更新. ...

  9. Python学习笔记之基础篇(-)python介绍与安装

    Python学习笔记之基础篇(-)初识python Python的理念:崇尚优美.清晰.简单,是一个优秀并广泛使用的语言. python的历史: 1989年,为了打发圣诞节假期,作者Guido开始写P ...

随机推荐

  1. java poi导出Excel 总结

    首先下载 Apache 的POI jar包 将更目录下的poi-3.8-20120326.jar 和lib下的三个jar包导入 如下图: 首先必须搞一个通用的工具类,网上找的,能用就行,java就是这 ...

  2. Servlet包介绍

    ----------------siwuxie095                         首先到 Tomcat 的官网下载 Tomcat 的 API 帮助文档     Tomcat 官网: ...

  3. PCLVisualizer可视化类(2)

    博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=163 可视化点云颜色特征 所示,点赋予不同的颜色表征其对应的z轴值不同.PC ...

  4. Sharding-JDBC 使用入门和基本配置

    一.什么是Sharding-JDBC Sharding-JDBC定位为轻量级Java框架,在Java的JDBC层提供的额外服务.它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理 ...

  5. PostFX v2后期处理特效包:升级更惊艳的视觉效果

    https://mp.weixin.qq.com/s/BMkLLuagbhRSWspzeGhK7g Post-Processing Stack后期处理特效包能够轻松创建和调整高质量视觉效果,实现更为惊 ...

  6. CTO成长之路分享会

    1. 李宏玮,纪源资本合伙人GGV,设计无人机,典型的投资: VC做投资,收入利润上市技术团队,架构支撑前沿科技,以后牛逼公司以技术为主 2. 小红书tiger2003加入谷歌,之前学phpgoogl ...

  7. Oracle12c 数据库找到Scott账户的方法

    因为Oracle12c数据库中引入了CDB与PDB的概念(具体介绍请参考潇湘隐者的文章http://www.cnblogs.com/kerrycode/p/3386917.html),我们之前常用的练 ...

  8. cropper.js裁剪图片的使用

    这两天难得有时间可以整理一下最近学习的东西,这两天项目中用到了头像上传裁剪的功能,这里只介绍头像的裁剪吧. 单独实现图片剪裁的功能还是挺容易的,入门级别的.看一遍官方给的文档,基本上就明白了.大家如果 ...

  9. windows系统下python2.7.14版本的安装

    [前言] 本文主要对window下如何安装Python进行图解说明. [正文] 步骤一 从官网下载相应的版本(本文以2.7.14为例),下载地址:https://www.python.org/down ...

  10. JML契约式设计——第三单元学习小结

    一.前言 本单元作业都是关于JML(Java Modeling Language),JML是一种契约式设计(Design by Contract)的语言,契约式设计的主要目的是希望程序员能够在设计程序 ...