Python并发编程-生产消费模型
生产消费模型初步
#产生两个子进程,Queue可以在子进程之间传递消息
from multiprocessing import Queue,Process
import random
import time
#队列是进程安全的,队列里的数据只能被一个进程获取,所有q.put(None)只对应一个进程,所以要放两个q.put(None)
def producer(name, food, q):
for i in range(10):
time.sleep(random.randint(1,3))
f = ('%s生产了%s%s' %(name,food,i))
print(f)
q.put(f)
def consume(q,name):
while True:
food = q.get()
if food is None:
print('%s获取了个一个空'%name)
break
print('\033[31m%s消费了%s\033[0m' % (name, food))
time.sleep(random.randint(1,3))
if __name__ == '__main__':
q = Queue(20) #Queue可以在进程间传递数据
p = Process(target=producer, args=('Egon','包子',q))
p2 = Process(target=producer, args=('WuSir', '泔水', q))
p.start()
p2.start()
c = Process(target=consume, args=(q,'Alex'))
c2 = Process(target=consume, args=(q,'jinboss'))
c.start()
c2.start()
p.join()#使得主进程感知P,P2的结束
p2.join()
q.put(None)
q.put(None)
利用JoinableQueue改进生产消费模型
- 前一版的主要问题是不知道生产者和消费者的数量不可确定
#产生两个子进程,Queue可以在子进程之间传递消息
from multiprocessing import Process, JoinableQueue
import random
import time
#队列是进程安全的,队列里的数据只能被一个进程获取,所有q.put(None)只对应一个进程,所以要放两个q.put(None)
def producer(name, food, q):
for i in range(10):
time.sleep(random.randint(1,3))
f = ('%s生产了%s%s' %(name,food,i))
print(f)
q.put(f)
q.join() #感知一个队列中的数据全部被执行完毕,阻塞,直至所有数据处理完毕
#增加了join后,生产者得等到消费者把生产的数据都消费了才结束
def consume(q,name):
while True:
food = q.get()
if food is None:
print('%s获取了个一个空'%name)
break
print('\033[31m%s消费了%s\033[0m' % (name, food))
time.sleep(random.randint(1,3))
q.task_done() #提交取出数据已完成的信号, count-1
if __name__ == '__main__':
q = JoinableQueue(20) #Queue可以在进程间传递数据
p = Process(target=producer, args=('Egon','包子',q))
p2 = Process(target=producer, args=('WuSir', '泔水', q))
p.start()
p2.start()
c = Process(target=consume, args=(q,'Alex'))
c2 = Process(target=consume, args=(q,'jinboss'))
c.daemon = True #关键步骤
c2.daemon = True #主进程中代码执行完毕之后,会自动结束,这两个守护进程会随着
#p,p2的进程的结束而结束
c.start()
c2.start()
p.join()#主进程感知P,P2的结束
p2.join()
# q.put(None)
# q.put(None)
#首先在消费者这端:
# 每次获取一个数据
# 处理一个数据
# 发送一个记号:标志一个数据被处理成功
#在生产者这一端:
# 每一次生产一个数据
# 且每一次生产的数据都放在队列中
# 在队列中刻上一个记号
# 当生产者全部生产完毕之后
# 发送Join信号,标志着生产者已经停止生产数据了, 且要等待之前被刻上记号的数据都被消费完
# 当数据都被处理完是, join阻塞结束
#consumer中把所有的任务消耗完
#producer端的join感知到,停止阻塞
#所有的producer进程结束
#主进程的P.join结束
#主进程代码结束
#守护进程(消费者进程)跟着结束
Python并发编程-生产消费模型的更多相关文章
- python 并发编程 多路复用IO模型
多路复用IO(IO multiplexing) 这种IO方式为事件驱动IO(event driven IO). 我们都知道,select/epoll的好处就在于单个进程process就可以同时处理多个 ...
- python 并发编程 阻塞IO模型
阻塞IO(blocking IO) 在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样: 当用户进程调用了recvfrom这个系统调用,kernel内核就 ...
- python 并发编程 异步IO模型
异步IO(Asynchronous I/O) Linux下的asynchronous IO其实用得不多,从内核2.6版本才开始引入.先看一下它的流程: 用户进程发起read操作之后,立刻就可以开始去做 ...
- python 并发编程 io模型 目录
python 并发编程 IO模型介绍 python 并发编程 socket 服务端 客户端 阻塞io行为 python 并发编程 阻塞IO模型 python 并发编程 非阻塞IO模型 python 并 ...
- Python并发编程04 /多线程、生产消费者模型、线程进程对比、线程的方法、线程join、守护线程、线程互斥锁
Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线程join.守护线程.线程互斥锁 目录 Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线 ...
- Python并发编程二(多线程、协程、IO模型)
1.python并发编程之多线程(理论) 1.1线程概念 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程(流水线的工作需要电源,电源就相当于 ...
- Python并发编程系列之多线程
1 引言 上一篇博文详细总结了Python进程的用法,这一篇博文来所以说Python中线程的用法.实际上,程序的运行都是以线程为基本单位的,每一个进程中都至少有一个线程(主线程),线程又可以创建子线程 ...
- python并发编程&多进程(二)
前导理论知识见:python并发编程&多进程(一) 一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_cou ...
- 快速了解Python并发编程的工程实现(上)
关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...
随机推荐
- Ubuntu+NDK编译支持HTTPS的libcurl
参考文章:1.NDK环境配置 http://blog.csdn.net/smfwuxiao/article/details/65877092.libcurl的配置修改 http://piggyq.co ...
- Emacs ^ Vim
Emacs存活: http://files.cnblogs.com/files/TheRoadToTheGold/Emacs%E2%80%94%E2%80%94%E5%AD%98%E6%B4%BB.z ...
- Google guava 中的Monitor
synchronized 自从Java提供了多线程编程,我们经常需要处理这样的情况:在特定的时间,我们需要限制访问,确保只有一个线程访问我们的代码.Java提供了同步关键字synchronized来实 ...
- 10个基于 JavaScript 的 WYSIWYG 编辑器
COMSHARP CMS 写道:在线编辑内容的时候,那些基于 JavaScript 的编辑器帮了我们大忙,这些所见即所得(WYSIWYG)编辑器,给我们提供了类似 Office 的操作体验.如今,任何 ...
- 无废话JavaScript(下)
五.函数式 这个可不是JavaScript的发明,它的发明人已经死了,而他的这个发明还在困扰着我们……如同爱迪生的灯泡还在照耀着我们. 其实函数式语言很简单,它就是一种与命令式语言同样“完备”的语言实 ...
- 在asp.net中使用加密数据库联接字符串
在我们发布网站时,加密web.config,这样可以有效保证数据库用户和密码安全,其步骤如下: 1.添加密钥 执行:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50 ...
- 【洛谷 P2216】 [HAOI2007]理想的正方形(二维ST表)
题目链接 做出二维\(ST\)表,然后\(O(n^2)\)扫一遍就好了. #include <cstdio> #include <cstring> #include <a ...
- 论文里有公式?用texlive+texstudio(windows下)
要写论文了,但论文里有一大堆公式,感觉很麻烦,经过询问同学知道有tex这么个东西,可以像写代码一样写论文,许多论文的格式都有相关的模板,所以学习一下,这里记录一下环境安装. texlive和texst ...
- 信息收集之zoomeye
一.浏览器上使用api接口 1.https://api.zoomeye.org/user/login post传参:{"username" : "username&quo ...
- 怎么让IIS7第一次访问相应速度加快
当我们把网站部署在IIS7或IIS6S的时候,每当IIS或是Application Pool重启后,第一次请求网站反应总是很慢,原因大家都知道(不知道可以参考这个动画说明ASP.NET网页第一个Req ...