#!/usr/bin/env python
# encoding: utf-8
# Date: 2018/6/17
import time
from multiprocessing import Process, JoinableQueue
def producer(q):
for i in range(10):
res = '包子 %s' % i
time.sleep(0.5) # 模拟生产者造一条数据的时间
print('生产者生产了%s' % res)
# consumer(res) # 生产者生产的数据不能直接交给消费者
q.put(res) # 生产者生产的数据交给容器queue
q.join() # 等到消费者把自己放入队列中的所有的数据都取走之后,生产者才结束
def consumer(q):
while True: # 一直接消息
res = q.get()
if res is None: break # 因为生产者最后一个放的是None
time.sleep(1)
print('消费者消费了%s' % res)
q.task_done() # 发送信号给q.join(),说明已经从队列中取走一个数据并处理完毕了
if __name__ == '__main__':
# 容器
# q = Queue() # 解耦和生产者和消费者
q = JoinableQueue()
p1 = Process(target=producer, args=(q, ))
p2 = Process(target=producer, args=(q, ))
p3 = Process(target=producer, args=(q, ))
# 消费者
c1 = Process(target=consumer, args=(q, ))
c2 = Process(target=consumer, args=(q, ))
c1.daemon = True
c2.daemon = True
p1.start()
p2.start()
p3.start()
c1.start()
c2.start()
p1.join() # 主进程保证生产者可以生产完毕
p2.join() # 主进程保证生产者可以生产完毕
p3.join() # 主进程保证生产者可以生产完毕
# q.put(None) # 生产完毕之后,添加一个None数据,这种模式生产者消费者多了就需要发多个None,并且joinN个生产者
# 1、主进程等生产者p1、p2、p3结束
# 2、而p1、p2、p3是在消费者把所有数据都取干净之后才会结束
# 3、所以一旦p1、p2、p3结束了,证明消费者也没必要存在了,应该随着主进程一块死掉,因而需要将生产者们设置成守护进程
print('主')