IPC机制:进程间通信或跨进程通信,指两个进程之间进行数据交换。
模型:生产者+媒介(队列)+消费者(用到的就是IPC机制)
这里队列用JoinableQueue这个模块,该模块有以下几个方法:
JoinableQueue()内有自带计数器,每当队列放一个数据的时候,会自动+1
task_done()方法,每从队列取出一个数据的时候,会自动减1
q.join(),当计数器为0时候才会执行
同时:将消费者进程设置成守护进程,这样q.join()执行完毕的时候,消费者子进程也会跟着结束
c1.daemon=True
具体完整代码如下:
# -*-coding:utf-8 -*- from multiprocessing import Process, Queue, JoinableQueue import time import random def productor(name, food, q): for i in range(1,4): data="%s做好了%s%s"%(name,food,i) # 模拟延迟 time.sleep(random.randint(1,3)) q.put(data) print(data) def customer(name, q): while True: food=q.get() #模拟延迟 time.sleep(random.randint(1,3)) print("%s吃了%s"%(name,food)) # task_done()方法,每从队列取出一个数据的时候,会自动减1 q.task_done() if __name__ == '__main__': #JoinableQueue()内有自带计数器,每当队列放一个数据的时候,会自动+1 q = JoinableQueue() # 生产者 p1 = Process(target=productor, args=('alex', '包子', q,)) p2 = Process(target=productor, args=('egon', '肠粉', q,)) # 消费者 c1=Process(target=customer,args=('李浩', q,)) c2 = Process(target=customer, args=('猪哥', q,)) # 开启守护进程 c1.daemon=True c2.daemon=True # 开启进程 p1.start() p2.start() c1.start() c2.start() # 保证生产全部生产完 p1.join() p2.join() # q.join(),当计数器为0时候才会执行 q.join()