• 生产者消费者模型


    生产者消费者模型

    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





  • 相关阅读:
    一个封装好的CSV文件操作C#类代码
    C#导出GridView数据到Excel文件类
    JQ获取选中select 标签的值
    JQ替换标签与内容
    layerUi与AJAX的一种思路
    .NET MVC同页面显示从不同数据库(mssql、mysql)的数据
    MVC Html辅助方法DropDownList的简单使用、连接MYSQL数据库用自定义model类接收
    EF中GroupBy扩展方法的简单使用
    sqlserver操作命令
    发送短信验证码及调用短信接口与C# 后台 post 发送
  • 原文地址:https://www.cnblogs.com/zhouhao123/p/11225841.html
Copyright © 2020-2023  润新知