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():消费者发送吃完了信号
    从结果来看生产者和消费者有序的进行着,不会造成混乱。

    爱,就是你和某个人一起经历的一切。
  • 相关阅读:
    asp.net将图片转成二进制存入数据库
    ionic2打包生成APK报错 Error: Could not find gradle wrapper within Android SDK. Might need to update your Android SDK. Looked here: D:AndroidSDK ools emplatesgradlewrapper
    'ionic' 不是内部或外部命令,也不是可运行的程序或批处理文件。
    ABP-vs2017执行Add-Migration出现的问题
    关闭页面时,弹出JS提示框提示是否关闭
    C#生成Bar Code Image
    MemoryStream转imageSource
    RadControls RadGridView 显示加载数据时间
    RadGridView 分页控件
    CRM2011弹出asp.net模态窗口关闭的问题
  • 原文地址:https://www.cnblogs.com/afly-8/p/13561136.html
Copyright © 2011-2022 走看看