首页 > 编程语言 >python-生产者与消费者模型

python-生产者与消费者模型

时间:2022-10-07 14:56:10浏览次数:49  
标签:__ Process name start python 模型 args 生产者 food

"""
生产者;
	生产/制造东西的
消费者:
	消费/处理东西的

该模型除了上述两个之外还需要一个媒介
	生活中的例子做包子,将包子做好之后放在蒸笼里(媒介),买包子的取蒸笼里面拿
	厨师做菜做完之后用盘子装着给你消费者递过去
	生产者和消费者之间不是直接做交互的,而是借助于媒介做交互
生产者(做包子)  + 消息队列 (蒸笼) + 消费者(客人)
 

"""
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

相关文章