上一篇文章介绍了生产消费者模式与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. Animations使用01 BrowserAnimationsModule

    1 基础知识 1.1 动画 就是从一个状态过渡到另外一个状态 1.2 状态 元素本身的形状.颜色.大小等 1.3 Angular中的动画 给元素添加一个触发器,当这个触发器被触发后就会让该元素的状态发 ...

  2. 笔试题: 数据库 已看1 一些关键的sql语句练习 和选择题 有用 sql语句练习 挺好

    一.     选择题 1.SQL语言是( C )语言. A.层次数据库 B.网络数据库 C.关系数据库 D.非数据库     redis 是 3.如果在where子句中有两个条件要同时满足,应该用哪个 ...

  3. 16.Tomcat弱口令 && 后台getshell漏洞

    Tomcat7+ 弱口令 && 后台getshell漏洞 Tomcat版本:8.0 环境说明 Tomcat支持在后台部署war文件,可以直接将webshell部署到web目录下.其中, ...

  4. PHP中ob_start()函数的用法

    ob_start()函数用于打开缓冲区,比如header()函数之前如果就有输出,包括回车/空格/换行/都会有"Header had all ready send by"的错误,这 ...

  5. redis学习总结2

    redis配置文件说明:以下这篇文章已经说明的很明白了.感谢~ http://blog.sina.com.cn/s/blog_636415010101970j.html

  6. UVa 11468 Substring (AC自动机+概率DP)

    题意:给出一个字母表以及每个字母出现的概率.再给出一些模板串S.从字母表中每次随机拿出一个字母,一共拿L次组成一个产度为L的串, 问这个串不包含S中任何一个串的概率为多少? 析:先构造一个AC自动机, ...

  7. IOS 通讯录 右侧的字母栏

    http://blog.csdn.net/nicholas6lee/article/details/7633708 Android实现通讯录排序的方式,可借鉴.

  8. C#进行Post请求(解决url过长的问题)

    //实例代码: 1.post请求 private string GetImageXY(string imgbyte) { string result3 = string.Empty; try { st ...

  9. Cocos creator之javascript闭包

    .什么是闭包? 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. 作为一个函数变量的一个引用,当函数返回 ...

  10. Go:json包的坑

    import encoding/json func test() { m := make(map[string]string) a := `{"xiaoming":"男& ...