一:进程间的通信(IPC):先进先出  管道:队列=管道+锁

from multiprocessing import Queue
q=Queue(4)
q.put(['first',],block=True,timeout=3)
q.put({'x':2},block=True,timeout=3)
q.put(3,block=True,timeout=3)
q.put(4,block=True,timeout=3)
print(q.get(block=True,timeout=3))
print(q.get(block=True,timeout=3))
print(q.get(block=True,timeout=3))
print(q.get(block=True,timeout=3))
from multiprocessing import Queue #Queued队列模块

q=Queue()

print(q.get())
print(q.get())
print(q.get())
print(q.get()) q.put(['first'],block=True,timeout=3)
q.put({'x':2},block=True,timeout=3)
q.put(3,block=True,timeout=3) print(q.get(block=True,timeout=3))
print(q.get(block=True,timeout=3))
print(q.get(block=True,timeout=3))
print(q.get(block=True,timeout=3)) print(q.get_nowait()) #q.get(block=false)
print(q.get_nowait()) #q.get(block=false)
print(q.get_nowait()) #q.get(block=false)
print(q.get_nowait()) #q.get(block=false)

二:生产者消费者模型

1. 什么是生产者消费者模型
    生产者:代指生产数据的任务
    消费者:代指处理数据的任务
    该模型的工作方式:生产生产数据传递消费者处理
    实现方式: 生产者---->队列<------消费者 2. 为什么要用
    当程序中出现明细的两类任务,一类负责生产数据,一类负责处理数据,
    就可以引入生产者消费者模型来实现生产者与消费者的解耦合,平衡生产能力与消费能力,从提升效率 3. 如何用
import time, random
from multiprocessing import Process, Queue def produer(name, food, q):
for i in range(3): # 生产的数量
res = '%s%s' % (food, i)
# 造数据
time.sleep(random.randint(1, 3)) # 模拟生产数据的时间
q.put(res)
print('厨师【%s】做了<%s>' % (name, res)) def consumer(name, q):
while True:
res = q.get()
if res is None: break # 生产者生产完后break退出
time.sleep(random.randint(1, 3)) # 模拟处理数据的时间
print('吃货【%s】吃了<%s>' % (name, res)) if __name__ == '__main__':
q = Queue()
# 生产者们
p1 = Process(target=produer, args=('小混世魔王', '包子', q))
p2 = Process(target=produer, args=('中混世魔王', '馒头', q))
p3 = Process(target=produer, args=('大混世魔王', '鸡蛋', q)) # 消费者们
c1 = Process(target=consumer, args=('扒皮', q))
c2 = Process(target=consumer, args=('钢牙', q)) p1.start()
p2.start()
p3.start()
c1.start()
c2.start()
print('主')

生产者消费者模型

存在问题

此时的问题是主进程永远不会结束,原因是:生产者p在生产完后就结束了,但是消费者c在取空了q之后,则一直处于死循环中且卡在q.get()这一步。

===>解决方式无非是让生产者在生产完毕后,往队列中再发一个结束信号,这样消费者在接收到结束信号后就可以break出死循环

import time, random
from multiprocessing import Process, Queue def produer(name, food, q):
for i in range(3): # 生产的数量
res = '%s%s' % (food, i)
# 造数据
time.sleep(random.randint(1, 3)) # 模拟生产数据的时间
q.put(res)
print('厨师【%s】做了<%s>' % (name, res)) def consumer(name, q):
while True:
res = q.get()
if res is None: break # 生产者生产完后break退出
time.sleep(random.randint(1, 3)) # 模拟处理数据的时间
print('吃货【%s】吃了<%s>' % (name, res)) if __name__ == '__main__':
q = Queue()
# 生产者们
p1 = Process(target=produer, args=('小混世魔王', '包子', q))
p2 = Process(target=produer, args=('中混世魔王', '馒头', q))
p3 = Process(target=produer, args=('大混世魔王', '鸡蛋', q)) # 消费者们
c1 = Process(target=consumer, args=('扒皮', q))
c2 = Process(target=consumer, args=('钢牙', q)) p1.start()
p2.start()
p3.start()
c1.start()
c2.start() p1.join()
p2.join()
p3.join() # 保证所有生产者生产完东西
q.put(None) # 所有生产者都生产完,在队列的最后加上None信号
q.put(None) # 给第二个消费者的信号
print('主')

解决方案一:

===>队列允许项目的使用者通知生成者项目已经被成功处理。通知进程是使用共享的信号和条件变量来实现的

import time, random
from multiprocessing import Process, JoinableQueue def produer(name, food, q):
for i in range(3): # 生产的数量
res = '%s%s' % (food, i)
# 造数据
time.sleep(random.randint(1, 3)) # 模拟生产数据的时间
q.put(res)
print('厨师【%s】做了<%s>' % (name, res)) def consumer(name, q):
while True:
res = q.get()
time.sleep(random.randint(1, 3)) # 模拟处理数据的时间
print('吃货【%s】吃了<%s>' % (name, res))
q.task_done() #向q.join()发送一次信号,证明一个数据已经被取走了 if __name__ == '__main__':
q = JoinableQueue()
# 生产者们
p1 = Process(target=produer, args=('小混世魔王', '包子', q))
p2 = Process(target=produer, args=('中混世魔王', '馒头', q))
p3 = Process(target=produer, args=('大混世魔王', '鸡蛋', q)) # 消费者们
c1 = Process(target=consumer, args=('扒皮', q))
c2 = Process(target=consumer, args=('钢牙', q)) p1.start()
p2.start()
p3.start()
c1.start()
c2.start() p1.join()
p2.join()
p3.join() # 队列取空
print('主')

解决方案二:

Python 35 进程间的通信(IPC机制)、生产者消费者模型的更多相关文章

  1. python网络编程--进程(方法和通信),锁, 队列,生产者消费者模型

    1.进程 正在进行的一个过程或者说一个任务.负责执行任务的是cpu 进程(Process: 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在 ...

  2. python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型

    一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...

  3. python开发进程:互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型

    一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...

  4. 网络编程基础----并发编程 ---守护进程----同步锁 lock-----IPC机制----生产者消费者模型

    1  守护进程: 主进程 创建 守护进程   辅助主进程的运行 设置进程的 daemon属性 p1.daemon=True 1 守护进程会在主进程代码执行结束后就终止: 2 守护进程内无法再开启子进程 ...

  5. (并发编程)进程IPC,生产者消费者模型,守护进程补充

    一.IPC(进程间通信)机制进程之间通信必须找到一种介质,该介质必须满足1.是所有进程共享的2.必须是内存空间附加:帮我们自动处理好锁的问题 a.from multiprocessing import ...

  6. 守护、互斥锁、IPC和生产者消费者模型

    守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are ...

  7. 守护模式,互斥锁,IPC通讯,生产者消费者模型

    '''1,什么是生产者消费者模型 生产者:比喻的是程序中负责产生数据的任务 消费者:比喻的是程序中负责处理数据的任务 生产者->共享的介质(队列)<-消费者 2,为何用 实现了生产者与消费 ...

  8. 并发编程 - 进程 - 1.队列的使用/2.生产者消费者模型/3.JoinableQueue

    1.队列的使用: 队列引用的前提: 多个进程对同一块共享数据的修改:要从硬盘读文件,慢,还要考虑上锁: 所以就出现了 队列 和 管道 都在内存中(快): 队列 = 管道 + 上锁 用队列的目的: 进程 ...

  9. 4、网络并发编程--僵尸进程、孤儿进程、守护进程、互斥锁、消息队列、IPC机制、生产者消费者模型、线程理论与实操

    昨日内容回顾 操作系统发展史 1.穿孔卡片 CPU利用率极低 2.联机批处理系统 CPU效率有所提升 3.脱机批处理系统 CPU效率极大提升(现代计算机雏形) 多道技术(单核CPU) 串行:多个任务依 ...

随机推荐

  1. mongodb分片集群安装教程

    mongodb 集群包含副本集群,主从集群以及分片集群,分片集群比较复杂,这里测试我采用了三台机器,交差部署 blog地址:http://www.cnblogs.com/caoguo 一 .环境:#m ...

  2. 文艺平衡树(区间翻转)(Splay模板)

    这篇blog写的吼啊 #include<cstdio> #include<iostream> #include<cstring> using namespace s ...

  3. 前端自动化构建工具gulp使用

    1. 全局安装 gulp: $ npm install --global gulp 2. 作为项目的开发依赖(devDependencies)安装: $ npm install --save-dev ...

  4. 在django里用xlwt作EXCEL导出功能

    参考了以前kevin的代码,搞起来快呀,哈哈哈,,阿里亚多.... 代码的意思比较明白,不注释,几乎自解释... 就是定义EXCEL时,比较硬生生的,一步一步没有快捷的方法. 另外就是取时间出来时,如 ...

  5. [bzoj4066/2683]简单题_KD-Tree

    简单题 bzoj-4066 题目大意:n*n的棋盘,开始为均为0,支持:单点加权值,查询矩阵权值和,强制在线. 注释:$1\le n\le 5\cdot 10^5$,$1\le m \le 2\cdo ...

  6. [bzoj2654]tree_二分_kruskal

    tree bzoj-2654 题目大意:给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树.题目保证有解. 注释:$1\le V\le 5\cdot 10^4 ...

  7. [jdoj1258]野生动物园(change by panxf)_权值线段树_组合数

    人品计算 题目大意:n个数的a序列,m组询问.每次询问给出T,A,B,K.求在a序列的[A,B]的位置之内的K小值P,的$C_{T}^{P \% T} \% 10111$. 注释:每组询问保证区间只相 ...

  8. 洛谷 P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows

    P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 题目描述 Each of Farmer John's N (4 <= N <= 16) cows has a u ...

  9. assign retain 和copy的区别

    assign 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char)等 等. 此标记说明设置器直接进⾏行赋值,这也是默认值.在使⽤用垃圾 ...

  10. 通过urllib2抓取网页内容(1)

    一.urllib2发送请求 import urllib2 url = 'http://www.baidu.com' req = urllib2.Request(url) response = urll ...