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()