上一篇文章介绍了生产消费者模式与python+redis实例运用(基础篇),但是依旧遗留了一个问题,就是如果消费者消费的速度跟不上生产者,依旧会浪费我们大量的时间去等待,这时候我们就可以考虑使用多进程去解决这个问题。举一个类似上面厨师做菜的例子,厨师上菜速度又快又多,你一个人吃不完,怎么办?那就可以请几个朋友帮你一起吃!这就是我们今天要讲的多进程和协程。

先说说多进程和协程的好处,它可以最大的利用你cpu的资源和网络带宽,这样可以充分的节省程序消费的时间。在生产消费者模式中引入多进程和协程之前我们先简单入手一个实例(供初学者可以看懂之后的代码):

from multiprocessing import Process
import time def test(i):
while True:
print("我是子进程"+str(i))
time.sleep() if i==:
time.sleep()
print("我是进程" + str(i)) # print[(x,y) for x in range(10) if x%2 if x>3 for y in range(10) if y > 7 if y != 8]
if __name__ == '__main__':
processes=[]
for i in range():
p = Process(target=test,args=(i,))
p.start()
processes.append(p) print(processes)
for p in processes:
p.join()

以上的代码是一段简单的多进程,我们可以看到运行后三个进程都在运行,由于我这里让进程1睡眠10s,进程1和进程0,2是相对独立的,这里1的睡眠不会影响到进程0和2的运行,我们可以看到他们依旧在控制台不断的输出,这样,我们的多进程+消费者模式的雏形就出来了,现在只需要把我们消费者的业务逻辑替换进去就可以了。这里多说一句,有时候我们会不清楚多进程和多线程的概念,这个可以这么理解,进程消费的资源是一个大类,而线程消费的资源是从进程里面来的,一个线程死了会影响到其他线程,但多进程之间是相对独立的,一个进程死了不会影响其他进程运行,这就是为什么我会在这里使用多进程而不是多线程,当然,对于多线程还有一定的优化,那就是协程,这个点我们会在生产消费者模式与python+redis实例运用(次高级篇)中介绍到。

好了,有了多进程的概念我们就可以开始生消模式的实现了:

这里我们的生产者与上一篇的不变:

from DBUtil import *
import time
from pandasql import sqldf
import redis 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会话队列上,当某个进程拿资源的时候redis会话队列加上锁,保证其他进程拿不到这个资源,当这个进程拿完资源后,释放锁,让其他进程去抢占资源:

import time
import redis
from multiprocessing import Process,Lock pool=redis.ConnectionPool(host='localhost', port=,db=,decode_responses=True)
r=redis.Redis(connection_pool=pool) def users(lock): length = r.llen("goods2")
print(length) while True: # print(1)
# 对资源进行加锁
lock.acquire() if length > :
goods = r.lpop("goods2")
# 获得资源后释放锁
lock.release()
#以下可以写自己的业务逻辑操作
try:
data = goods
print(data)
if str(goods) == "None":
print("无值多等等")
time.sleep()
except:
print("无值等等")
time.sleep()
users()
else:
print("无值等等")
time.sleep()
users(lock) if __name__ == '__main__': lock = Lock() processes = []
for i in range():
p = Process(target=users, args=(lock,))
p.start()
processes.append(p) for p in processes:
p.join()
print('处理完成')

以上就是多进程+生消模式,接下来会介绍生产消费者模式与python+redis实例运用(次高级篇),这里会加上协程的概念。欢迎收看。

生产消费者模式与python+redis实例运用(中级篇)的更多相关文章

  1. 生产消费者模式与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 正则表达式入门(中级篇) 初级篇链接:http://www.cnblogs.com/chuxiuhong/p/5885073.html 上一篇我们说在这一篇里,我们会介绍子表达式,向前向 ...

  7. 转载 Python 正则表达式入门(中级篇)

    Python 正则表达式入门(中级篇) 初级篇链接:http://www.cnblogs.com/chuxiuhong/p/5885073.html 上一篇我们说在这一篇里,我们会介绍子表达式,向前向 ...

  8. python使用rabbitMQ介绍一(生产-消费者模式)

    1 模式介绍 生产者-消费者模式是最简单的使用模式. 一个生产者P,给队列发送消息,一个消费者C来取队列的消息. 这里的队列长度不限,生产者和消费者都不用考虑队列的长度. 队列的模型图: 2 示例代码 ...

  9. Java多线程学习笔记--生产消费者模式

    实际开发中,我们经常会接触到生产消费者模型,如:Android的Looper相应handler处理UI操作,Socket通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前 ...

随机推荐

  1. 第三篇elasticsearch分布式安装

    elasticSearch 分布式安装 1.在elasticSearch下的config下elasticsearch.yml文件最后一行添加注意 一定要加空格在:后面cluster.name: wal ...

  2. 哪个U盘启动工具能安装红帽系统,

    安装红帽子,不要使用windows系统下的PE启动盘,两者引导方式不一样,不通用的.正确的方法是网上下载红帽子的ISO镜像文件后,用UltraISO这个工具写入优盘或者光盘,得到的系统盘才可以启动电脑 ...

  3. c++中Int装string

    java中,string类型非常强大,任何类型和string类型相加都变成了string类型.但是c++中string功能就比较少 int转string有两种方式 1:stringstream; ; ...

  4. ibatis分页的两种方式

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  5. 关闭QtCreator的vim风格编辑模式

    今天不小心点到了键盘的快捷键Alt+V,使QtCreator进入了vim风格编辑模式,导致快捷键拷贝粘贴都不正常,找了下资料才发现是这个问题.具体操作如下: 打开QtCreator去掉下列位置的勾选或 ...

  6. php奇技淫巧之自动装载

    知识储备: spl_autoload_register https://www.php.net/manual/zh/function.spl-autoload-register.php 测试目录结构 ...

  7. 数据库路由中间件MyCat - 源代码篇(16)

    此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 5. 路由模块 真正取得RouteResultset的步骤:AbstractRouteStrategy的ro ...

  8. haml

    创建: 2019/05/23 文档: http://haml.info/docs/yardoc/file.REFERENCE.html 安装  安装 gem "haml"     ...

  9. 用python实现杨辉三角

    def yanghui(lines): currentlst,lastlst,n=[],[],1 if lines<1: return while n<=lines: lastlst=cu ...

  10. .NET ToString() format格式化字符串(常用)

    前言 我们平常会用到货币数据类型,尤其当我们计算金钱或者算数的时候经常会遇到保留几位小数,而且碰到日期格式问题的时候,经常不知道选择什么样的格式比较合适,下面我找了一部分常用的.NET ToStrin ...