生产者消费者模型

生产者消费者模型

1. 什么是生产者消费者模型
生产者:代指生产数据的任务
消费者:代指处理数据的任务
该模型的工作方式:
生产生产数据传递消费者处理

实现方式:
生产者---->队列<------消费者

2. 为何要用
当程序中出现明细的两类任务,一类负责生产数据,一类负责处理数据
就可以引入生产者消费者模型来实现生产者与消费者的解耦合,平衡生产能力与消费能力,从提升效率
import time,random
from multiprocessing import Process,Queue

def producer(name,food,q):
    for i in range(3):
        res='%s%s' %(food,i)
        time.sleep(random.randint(1,3)) #模拟生产数据的时间
        q.put(res)
        print('厨师[%s]生产了<%s>' %(name,res))

def consumer(name,q):
    while True:
        res=q.get()
        if res is None:break #让消费者消费完,之后结束
        time.sleep(random.randint(1,3)) #模拟处理数据的时间
        print('吃货[%s]吃了<%s>' %(name,res))

if __name__ == '__main__':
    q=Queue()
    # 生产者们
    p1=Process(target=producer,args=('a','泔水',q))
    p2=Process(target=producer,args=('b','包子',q))
    p3=Process(target=producer,args=('c','腰子汤',q))
    # 消费者们
    c1=Process(target=consumer,args=('d',q))
    c2=Process(target=consumer,args=('e',q))

    p1.start()
    p2.start()
    p3.start()
    c1.start()
    c2.start()

    p1.join()
    p2.join()
    p3.join()
    q.put(None)   结束生产者
    q.put(None)   结束消费者
    print('')

结果:
厨师[a]生产了<泔水0>
厨师[c]生产了<腰子汤0>
厨师[b]生产了<包子0>
厨师[c]生产了<腰子汤1>
吃货[d]吃了<泔水0>
厨师[a]生产了<泔水1>
厨师[b]生产了<包子1>
厨师[c]生产了<腰子汤2>
吃货[e]吃了<腰子汤0>
厨师[a]生产了<泔水2>
厨师[b]生产了<包子2>
主
吃货[e]吃了<腰子汤1>
吃货[e]吃了<泔水1>
吃货[d]吃了<包子0>
吃货[e]吃了<包子1>
吃货[d]吃了<腰子汤2>
吃货[e]吃了<泔水2>
吃货[d]吃了<包子2>
生产者消费者模型1
import time,random
from multiprocessing import Process,JoinableQueue

def producer(name,food,q):
    for i in range(3):
        res='%s%s' %(food,i)
        time.sleep(random.randint(1,3)) #模拟生产数据的时间
        q.put(res)
        print('厨师[%s]生产了<%s>' %(name,res))

def consumer(name,q):
    while True:
        res=q.get()
        time.sleep(random.randint(1,3)) #模拟处理数据的时间
        print('吃货[%s]吃了<%s>' %(name,res))
        q.task_done() #发信号,消费者每次取走一个,就减去一个

if __name__ == '__main__':
    q=JoinableQueue()  #可以执行q.join()
    # 生产者们
    p1=Process(target=producer,args=('a','泔水',q))
    p2=Process(target=producer,args=('b','包子',q))
    p3=Process(target=producer,args=('c','腰子汤',q))
    # 消费者们
    c1=Process(target=consumer,args=('d',q))
    c2=Process(target=consumer,args=('e',q))
    c1.daemon=True
    c2.daemon=True

    p1.start()
    p2.start()
    p3.start()
    c1.start()
    c2.start()
#确保数据精准,等生产者都生产完
    p1.join()
    p2.join()
    p3.join()
    q.join() # 主进程等q结束,即q内数据被取干净了
    print('') #主一出现,说明生产者完了,消费者也完了

结果:
厨师[a]生产了<泔水0>
厨师[a]生产了<泔水1>
吃货[e]吃了<泔水0>
厨师[c]生产了<腰子汤0>
吃货[d]吃了<泔水1>
厨师[a]生产了<泔水2>
厨师[b]生产了<包子0>
吃货[d]吃了<泔水2>
厨师[b]生产了<包子1>
厨师[c]生产了<腰子汤1>
厨师[b]生产了<包子2>
吃货[e]吃了<腰子汤0>
吃货[d]吃了<包子0>
吃货[e]吃了<包子1>
吃货[e]吃了<包子2>
厨师[c]生产了<腰子汤2>
吃货[d]吃了<腰子汤1>
吃货[e]吃了<腰子汤2>
生产者消费者模型2





原文地址:https://www.cnblogs.com/zhouhao123/p/11225841.html