一:进程间的通信(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. Linux添加FTP用户并设置权限

    在linux中添加ftp用户,并设置相应的权限,操作步骤如下: 1.环境:ftp为vsftp.被限制用户名为test.被限制路径为/home/test 2.建用户,命令行状态下,在root用户下: 运 ...

  2. 数组的复制 --System.arraycopy()

    import java.util.Arrays; public class HellowWorld { public static void main(String[] argv ) { int[] ...

  3. js 弹出div窗口 可移动 可关闭

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  4. 棋盘DP三连——洛谷 P1004 方格取数 &&洛谷 P1006 传纸条 &&Codevs 2853 方格游戏

    P1004 方格取数 题目描述 设有N $\times N$N×N的方格图(N $\le 9$)(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字00.如下图所示(见样例): A ...

  5. uva10082 WERTYU (Uva10082)

    A common typing error is to place the hands on the keyboard one row to the right of the correct posi ...

  6. Python OS & sys模块

    os模块(* * * *) os模块是与操作系统交互的一个接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname" ...

  7. BZOJ 1601 USACO 2008 Oct. 灌水

    [Description] Farmer John已经决定把水灌到他的n(1<=n<=300)块农田,农田被数字1到n标记.把一块土地进行灌水有两种方法,从其他农田饮水,或者这块土地建造水 ...

  8. [NOIP2016day1T1] 玩具迷題(toy)

    题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业. 有一天, 这些玩具小人把小南的眼镜藏了起来. 小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外.如下图: 这时singer告诉 ...

  9. py文件控制台执行时,报错:引入的模块不存在

    1.描述:该模块在IDE中是可以正确执行的.但是从cmd控制台执行时,报错:该模块引入的其他模块不存在. 2.解决:在该模块的#encoding:utf-8 之后另起一行加如下代码: #encodin ...

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

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