一:进程间的通信(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. windows下使用批处理设置环境变量

    1. 设置临时环境变量 set BAT_HOME=c:\bat 此命令只对当前窗口有效,批处理或cmd窗口一关闭,变量就恢复原来的值了. 2. 设置永久环境变量 方法一 setx BAT_HOME C ...

  2. CAD从线型文件加载线型记录(com接口)

    主要用到函数说明: _DMxDrawX::LoadLinetypeFromFile 从线型文件加载线型记录,详细说明如下: 参数 说明 BSTR pszLinetypeFile 线型文件名,支持htt ...

  3. WinForm窗体中窗口控件的生成

    1:button控件的生成方式 Button button = new Button(); button.Size = new Size(80, 80); button.Location = new ...

  4. 基础:Post和Get区别

    1.get是从服务器上获取数据,post是向服务器传送数据.2.在客户端, get方式在通过URL提交数据,数据在URL中可以看到:post方式,数据放置在HTML HEADER内提交3.对于get方 ...

  5. IDEA 创建一个普通的java项目

    IntelliJ IDEA 如何创建一个普通的java项目,及创建java文件并运行 首先,确保idea软件正确安装完成,java开发工具包jdk安装完成. IntelliJ IDEA下载地址:htt ...

  6. for循环中索引值和取值的迷惑

    利用for循环和range从100——10,倒序讲所有的偶数添加到一个新列表中,然后对列表的元素进行筛选,将能被4整除的数留下来. even = []for i in range(100,9,-1): ...

  7. ie 浏览器下ajax请求来自缓存的解决方法

    如上图所示,在ie浏览器下发出的请求,如何缓存中已经出现过这条请求记录,则不会请求服务端数据,解决方法是在请求后增加一个随机数,使每次请求都不同*可以添加当前时间戳 url+'?t='+Date.no ...

  8. hdu2009 求数列的和【C++】

    求数列的和 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  9. 【Codeforces 126B】Password

    [链接] 我是链接,点我呀:) [题意] 给你一个字符串s 让你从中选出来一个字符串t 这个字符串t是s的前缀和后缀 且在除了前缀和后缀之外的中间部位出现过. 且要求t的长度最长. 让你输出这个字符串 ...

  10. CentOS 7.3降低内核版本为7.2

    查看当前内核版本: [root@nineep ~]# uname -r 2.3.10.0-514.2.2.el7.x86_64  查看当前发行版本: [root@nineep ~]# cat /etc ...