"""
生产者;
生产/制造东西的
消费者:
消费/处理东西的
该模型除了上述两个之外还需要一个媒介
生活中的例子做包子,将包子做好之后放在蒸笼里(媒介),买包子的取蒸笼里面拿
厨师做菜做完之后用盘子装着给你消费者递过去
生产者和消费者之间不是直接做交互的,而是借助于媒介做交互
生产者(做包子) + 消息队列 (蒸笼) + 消费者(客人)
"""
from multiprocessing import Process,Queue
import time,random
def producer(name,food,q):
for i in range():
data='%s生产了%s,%s'%(name,food,i)
time.sleep(random.randint(1,3))
print(data)
q.put(data)
def consumer(name,q):
while True:
food=q.get()
#判断当前是否有结束的表示
if food is None:break
time.sleep(random.randint(1,3))
print('%s吃了%s'%(name,food))
if __name__ == '__main__':
q=Queue()
p1=Process(target=producer,args=('大厨','包子',q))
p2=Process(target=producer,args=('张桑','养生汤',q))
c1=Process(target=consumer,args=('李四',q))
c2=Process(target=consumer,args=('王五',q))
p1.start()
p2.start()
c1.start()
c2.start()
p1.join()
p2.join()
#等待生产者生产完毕之后,往队列中添加特定的结束符号
q.put(None)#肯定在所有生产者生产的数据末尾
q.put(None)
#有两个消费者所以要放两个None
from multiprocessing import Process,JoinableQueue
import time,random
def producer(name,food,q):
for i in range():
data='%s生产了%s,%s'%(name,food,i)
time.sleep(random.randint(1,3))
print(data)
q.put(data)
def consumer(name,q):
while True:
food=q.get()
time.sleep(random.randint(1,3))
print('%s吃了%s'%(name,food))
q.task_done()#告诉队列你已经从里面取出了一个数据并且处理完毕了
if __name__ == '__main__':
q=JoinableQueue()
p1=Process(target=producer,args=('大厨','包子',q))
p2=Process(target=producer,args=('张桑','养生汤',q))
c1=Process(target=consumer,args=('李四',q))
c2=Process(target=consumer,args=('王五',q))
p1.start()
p2.start()
#将消费者设置成守护进程
c1.daemon=True
c2.daemon=True
c1.start()
c2.start()
p1.join()
p2.join()
q.join()#等待队列中所有的数据被取完再往下执行代码
"""
JoinableQueue 每当往队列中存入数据的时候,内部会有一个计数器+1
每当调用task_done的时候,计数器-1
q.join()当计数器为0的时候,才往后运行
"""
#只要q.join()执行完毕,说明消费者已经执行完毕了,消费值已经没有存在的意义了
标签:__,Process,name,start,python,模型,args,生产者,food
From: https://www.cnblogs.com/saury/p/16759716.html