# IPC Inter-Process Communication
# 实现进程之间通信的两种机制:
# 管道 Pipe 用的很少
# 队列 Queue
队列的特征:现进先出,栈属于后进后出
基本语法:from multiprocessing import Queue
q = Queue(3) 传参数表示只允许放入3个数,不是长度,是个数
q.get() 取不到的时候会有阻塞,不会报异常,程序挂起
q.put() 存入超出范围也不会报异常
q.getnowait() 拿不到报异常
q.put_nowait() 非阻塞版本的put ,放入超出范围也会报异常
q.empty() 检测是否为空 (了解) 在一边存一边取得时候判断不准确
q.full() 检测是否已经存满 (了解) 在一边存一边取得时候判断不准确
生产者和消费者模型:
生产者和消费者模型从程序上来讲就是数据的存入和获取的过程
最为理想的生产者和消费者模型 , 两者之间的运行速度应该是同步的
from multiprocessing import Process,Queue import time import random # 消费者方法 [负责取值] def consumer(q,name): while True: food = q.get() if food is None: break time.sleep(random.uniform(0.5,1)) print("%s吃了一个%s" % (name,food)) # 生产者方法 [负责存值] def producer(q,name,food): for i in range(5): time.sleep(random.uniform(0.3,0.8)) print("%s生产了%s" % (name,food)) q.put(food+str(i)) if __name__ == "__main__": q = Queue() c1 = Process(target=consumer,args=(q,"陈露中")) c2 = Process(target=consumer,args=(q,"陈根基")) # c1.daemon = True c1.start() c2.start() p1 = Process(target=producer,args=(q,"订海呀","地瓜")) p2 = Process(target=producer,args=(q,"陈红平","黄瓜")) p1.start() p2.start() p1.join() p2.join() q.put(None) # 添加None,让程序自动结束 q.put(None)
执行结果:
订海呀生产了地瓜
陈红平生产了黄瓜
订海呀生产了地瓜
陈红平生产了黄瓜
陈根基吃了一个黄瓜0
订海呀生产了地瓜
陈露中吃了一个地瓜0
陈红平生产了黄瓜
订海呀生产了地瓜
陈根基吃了一个地瓜1
陈露中吃了一个黄瓜1
陈红平生产了黄瓜
陈红平生产了黄瓜
陈根基吃了一个地瓜2
订海呀生产了地瓜
陈露中吃了一个黄瓜2
陈根基吃了一个地瓜3
陈露中吃了一个黄瓜3
陈根基吃了一个黄瓜4
陈露中吃了一个地瓜4