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:/ ...
随机推荐
- [DeeplearningAI笔记]序列模型2.10词嵌入除偏
5.2自然语言处理 觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.10词嵌入除偏 Debiasing word embeddings Bolukbasi T, Chang K W, Zo ...
- vijos 1288 箱子游戏 计算几何
背景 hzy是箱子迷,他很喜欢摆放箱子,这次他邀请zdq,skoier一起来玩game... 描述 地板上有一个正方形的大箱子和许多三角型的小箱子.所有的小箱子都在大箱子里面,同时,一些三角形的小箱子 ...
- Android 菜单和上下文演示
在Action添加个TextView控件(上下文演示用); package com.example.test; import android.app.Activity;import android.o ...
- GridControl详解(四)分组排序汇总
分组: 按时间分第一组: 按性别分第二组: 显示结果: 高级设置: 将所有组展开代码:gridView1.ExpandAllGroups(); 显示结果: 自定义组名,GridView级事件 增加事件 ...
- DHTML Object Model&DHTML&DOM
DHTML Object Model:DHTML对象模型,利用DHTML Object Model可以单独操作页面上的对象,每个HTML标记通过它的ID和NAME属性被操纵,每个对象都具有自己的属性. ...
- 【BZOJ】3302: [Shoi2005]树的双中心 && 2103: Fire 消防站 && 2447: 消防站
[题意]给定带点权树,要求选择两个点x,y,满足所有点到这两个点中较近者的距离*点权的和最小.n<=50000,h<=100. [算法]树的重心 [题解]代码参考自:cgh_Andy 观察 ...
- 【CodeForces】901 B. GCD of Polynomials
[题目]B. GCD of Polynomials [题意]给定n,要求两个最高次项不超过n的多项式(第一个>第二个),使得到它们GCD的辗转次数为n.n<=150. [算法]构造 [题解 ...
- js关闭当前页面跳转新页面
页面代码: <p class="info"><span style="font-weight: bold">所属项目:</span ...
- Django之Form组件验证
今天来谈谈Django的Form组件操作 Django中的Form一般有两种功能: ·输入html ·验证用户输入 Form验证流程 ·定义规则(是一个类) ·前端把数据提交过来 ·匹配规则 · ...
- 深入理解Spring系列之六:bean初始化
转载 https://mp.weixin.qq.com/s/SmtqoELzBEdZLo8wsSvUdQ <深入理解Spring系列之四:BeanDefinition装载前奏曲>中提到,对 ...