zoukankan      html  css  js  c++  java
  • 生产者&消费者模型

    在并发编程中,如果生产者处理速度很快,而消费者处理速度比较慢,那么生产者就必须等
    待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那
    么消费者就必须等待生产者。为了解决这个等待的问题,就引入了生产者与消费者模型。让
    它们之间可以不停的生产和消费

    举例:
    在一个包子铺,师傅做包子(生产者),客人吃包子(消费者),但是呢后厨与餐厅之间是通过服务员来做中间工作,所以他们不接触,生产者只管做好包子放在固定地方,有客人来吃完就继续做。:生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。

    from queue import Queue #队列 (包子暂存地)
    from threading import Thread  #线程(同时进行)
    import time 
    q = Queue(10) #(一次存放十个包子)
    def producer(name):
        count = 1 #给生产计数
        while True:
            q.join() 
            q.put(count) #收信号(没包子或者包子被吃了,开始做包子)
            print('%s正在生产第%d个包子'%(name,count))
            count += 1
            time.sleep(2) #两秒做
    def customer(name):
        count = 1
        while True:
            bao_zi = q.get()
            print('消费者%s正在吃第%d个包子'%(name,bao_zi))
            count += 1
            q.task_done()
            time.sleep(1) #一秒吃
    if __name__ == '__main__':
        t1 = Thread(target=producer,args=('王大厨',))
        t2 = Thread(target=customer,args=('李小馒',))
        t1.start()
        t2.start()
    
    #结果:
    王大厨正在生产第1个包子
    消费者李小馒正在吃第1个包子
    王大厨正在生产第2个包子消费者李小馒正在吃第2个包子
    
    王大厨正在生产第3个包子消费者李小馒正在吃第3个包子
    
    王大厨正在生产第4个包子
    消费者李小馒正在吃第4个包子
    王大厨正在生产第5个包子
    消费者李小馒正在吃第5个包子
    王大厨正在生产第6个包子
    消费者李小馒正在吃第6个包子
    王大厨正在生产第7个包子
    消费者李小馒正在吃第7个包子
    王大厨正在生产第8个包子消费者李小馒正在吃第8个包子
    
    王大厨正在生产第9个包子
    消费者李小馒正在吃第9个包子
    王大厨正在生产第10个包子消费者李小馒正在吃第10个包子
    
    王大厨正在生产第11个包子
    消费者李小馒正在吃第11个包子
    王大厨正在生产第12个包子
    消费者李小馒正在吃第12个包子
    王大厨正在生产第13个包子消费者李小馒正在吃第13个包子
    
    王大厨正在生产第14个包子消费者李小馒正在吃第14个包子
    

    q.join():生产者负责接收信号
    q.task_done():消费者发送吃完了信号
    从结果来看生产者和消费者有序的进行着,不会造成混乱。

    爱,就是你和某个人一起经历的一切。
  • 相关阅读:
    linux tcpdump补充
    一个由有符号下标引起的bug
    leetcode-First Missing Positive
    Flutter移动电商实战 --(26)列表页_使用Provide控制子类-2
    Flutter移动电商实战 --(25)列表页_使用Provide控制子类-1
    Flutter移动电商实战 --(24)Provide状态管理基础
    Flutter移动电商实战 --(23)分类页_左侧类别导航制作
    Flutter移动电商实战 --(22)JSON解析和复杂数据模型转换技巧
    [翻译] NSDate-TimeAgo
    Replace-iOS
  • 原文地址:https://www.cnblogs.com/afly-8/p/13561136.html
Copyright © 2011-2022 走看看